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());
}
}
}

日志猫:

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()移至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 回答