5

アプリケーションを構築していて、AsyncTask の内部で NetworkOnMainThreadException を取得してます

電話:

new POST(this).execute("");

非同期タスク:

public class POST extends AsyncTask<String, Integer, HttpResponse>{
private MainActivity form;
public POST(MainActivity form){
    this.form = form;
}


@Override
protected HttpResponse doInBackground(String... params) {
try {
        HttpPost httppost = new HttpPost("http://diarwe.com:8080/account/login");
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
    nameValuePairs.add(new BasicNameValuePair("email",((EditText)form.findViewById(R.id.in_email)).getText().toString()));
    //add more...
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    return new DefaultHttpClient().execute(httppost);
} catch (Exception e) {
    Log.e("BackgroundError", e.toString());
}
return null;
}

@Override
protected void onPostExecute(HttpResponse result) {
super.onPostExecute(result);
try {
    Gson gSon = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();
    gSon.fromJson(IOUtils.toString(result.getEntity().getContent()), LogonInfo.class).fill(form);
} catch (Exception e) {
    Log.e("BackgroundError", e.toString());
}
}
}

LogCat:

BackgroundError | android.os.NetworkOnMainThreadException

なぜこの例外が AsyncTask の doInBackground の do でスローされるのか、非常に混乱しています。

4

3 に答える 3

7

JSONコードをdoInBackground()次の場所に移動します。

@Override
protected HttpResponse doInBackground(String... params) {
    ...
    Your current HttpPost code...
    ...
    Gson gSon = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();
    gSon.fromJson(IOUtils.toString(result.getEntity().getContent()), LogonInfo.class).fill(form);
    ...
}
于 2013-04-25T00:28:16.973 に答える
2

result.getEntity().getContent()ネットワークから読み取るストリームを開くため、ネットワーク通信はメインスレッドにあります。JSON 解析を に移動しdoInBackground()、UI タスクのみを実行しonPostExecute()ます。

于 2013-04-25T00:28:30.920 に答える
0

を に継承しているため、問題が発生していると思います 。コードのこの部分を削除してみてMainActivityください。AsyncTask

private MainActivity form;
public POST(MainActivity form){
    this.form = form;
}

あなたはそれを必要としないので、引数をに渡したい場合は、メソッドAsyncTaskを介してdoInBackGround()すぐに渡すことができます。

AsyncTaskまた、次の使用を呼び出すにはnew POST().execute();

super.onPostExecute(result);また、メソッドを呼び出す必要はありませんonPostExecute()

これが助けになることを願っています。

于 2013-04-25T00:38:21.177 に答える