私は割り当て用のプロジェクトを作成しています。Androidは初めてで、非常に一般的なURLからjsonにアクセスしたいと思っていましたhttp://api.androidhive.info/contacts/
、
問題:私はURLを読み取って、このURLから返されたjsonをフェッチして解析しようとしています、
私はすでにAndroidManifest.xmlに次の行を追加しました
<uses-permission Android:name="Android.permission.INTERNET"/>
設定:およびmy Android設定は
<uses-sdk
Android:minSdkVersion="8"
Android:targetSdkVersion="18" />
これは私がURLを読み取ろうとしている方法です
static InputStream is = null;
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
エラーメッセージ
11-02 05:23:47.843: E/AndroidRuntime(2207): FATAL EXCEPTION: main
11-02 05:23:47.843: E/AndroidRuntime(2207): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me.countrypedia/com.me.countrypedia.MainActivity}: Android.os.NetworkOnMainThreadException
11-02 05:23:47.843: E/AndroidRuntime(2207): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2211)
11-02 05:23:47.843: E/AndroidRuntime(2207): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2261)
11-02 05:23:47.843: E/AndroidRuntime(2207): at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
11-02 05:23:47.843: E/AndroidRuntime(2207): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1256)
また、私はこのチュートリアルをListViewの例で使用しています http://www.androidhive.info/2011/11/Android-xml-parsing-tutorial/
あなたのException
は実際にあなたが間違っていることを正確に伝えます。別のスレッドを使用してNetworkOperationsを実行していません。代わりに、UIスレッドでネットワーク操作を実行しますが、これはAndroidでは機能しません(機能しません)。
URLに接続するコードは、たとえばAsyncTasksdoInBackground()
メソッド内で実行する必要がありますUIスレッドをオフにします。
AsyncTaskの使用方法に関するこの質問を見てください:AsyncTaskの使用方法
更新された回答:
networkなどの長時間実行される可能性のある操作は、ワーカースレッドで実行する必要があります。
より長い操作のワーカースレッドを作成する最も効果的な方法は、 AsyncTask クラスを使用することです。単に AsyncTask を拡張し、 doInBackground() メソッドを実装して作業を実行します。
Volley 、 retrofit などのネットワーク操作を実行するための多くのライブラリが利用可能です。
古い回答:
アクティビティonCreate
メソッドに次の行を追加します
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
次のコードを使用します。
private class UpdateTask extends AsyncTask<String, String,String> {
protected String doInBackground(String... urls) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
return null;
}
}
そしてあなたのManinActivityで次のコードを使用してください。
new UpdateTask().execute();