2013-04-25 80 views
5

我建立一个应用程序,我得到一个NetworkOnMainThreadException INSIDE一个的AsyncTaskandroid.os.NetworkOnMainThreadException里面的AsyncTask

电话:

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

的AsyncTask:

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中做任何想法?

回答

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); 
    ... 
} 
+1

除''doInBackground()'外,'AsyncTask'中的所有内容都在主UI线程上。总体思路是支持常见的用例,比如:在'onPreExecute()'中设置'ProgressBar',在'onProgressUpdate()'中更新'ProgressBar',最后在'onPostExecute )'。所有这些函数都是UI线程安全的,而'doInBackground()'可以安全地花费尽可能多的时间。 – 2013-04-25 00:58:09

2

result.getEntity().getContent()打开从网络读取的流,所以在主线程的网络通信。将JSON解析移至doInBackground(),并仅执行onPostExecute()中的UI任务。

+0

非常感谢!只是为了将来的参考,'onPostExicute'是在主线程? – 2013-04-25 00:33:33

+0

这是正确的。 'onPreExecute()'也是。你需要知道的一切可以在这里找到:http://developer.android.com/reference/android/os/AsyncTask.html – SimonSays 2013-04-25 00:49:09

0

我觉得出现问题,因为你是继承了MainActivity到您AsyncTask,尽量reomve这部分代码:

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

因为你不需要它,如果你想传递任何参数的AsyncTask你可以通过它立即传递doInBackGround()方法。

还打电话给你AsyncTask使用以下new POST().execute();

而且你不需要调用super.onPostExecute(result);到您的onPostExecute()方法。

我希望这个帮助。

相关问题