使用AsyncTask时主线程上出现网络错误

时间:2014-09-19 15:08:30

标签: java android android-asynctask networkonmainthread

我正在尝试构建我的第一个Android应用程序,它使用AsyncTask来执行发布请求。 (登录网站)。

我在关闭StrictMode的情况下使应用程序正常工作,但我希望它在StrictMode中执行时也没有错误。虽然我使用AsyncTask重新设计了我的应用程序但它仍然给我这个错误:

android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)

根据我在互联网上阅读的内容,使用AsyncTask应该已经解决了这个问题。我不想使用Java Threads,因为我想学习正确的方法。

我构建了一个新类来执行任务,它被称为MyAsyncTask,这里是de class code

<code>
package com.am.tuto;
import android.os.AsyncTask;// removed rest of imports for readability
public class MyAsyncTask extends AsyncTask<Void, Void, String> {
String u;
String p;

public MyAsyncTask(String u, String p)
{
    this.u=u;
    this.p=p;
}

@Override protected String doInBackground(Void... params) {
String msg="";
if ((u.length()>0)&&(p.length()>0))
{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://irrationalgamers.com/test.php");
try 
{
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("username", u));
    nameValuePairs.add(new BasicNameValuePair("password", p));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response =httpclient.execute(httppost); // <----the error occurs
    HttpEntity entity = response.getEntity();
    String responseString = EntityUtils.toString(entity, "UTF-8");
    System.out.println(responseString);
    msg="success";
    msg=responseString;
} 

catch (ClientProtocolException e) 
{
// TODO Auto-generated catch block
} 
catch (IOException e) 
{
// TODO Auto-generated catch block
}  
}
else
{
   msg="failed";
}
return msg;
}

@Override protected void onPostExecute(String result) 
{
    MyBus.getInstance().post(new AsyncTaskResultEvent(doInBackground()));
}
}
</code>

我在想这可能是因为我创建了自己的构造函数,但我觉得我必须传递一些参数。

我可以继续对应用程序进行编程,但是了解如何在将来防止此问题会很好。我读到的关于错误的每篇文章都指向AsyncTask,很难找到已经实现的解决方案...

对此的任何想法都会受到高度评价

1 个答案:

答案 0 :(得分:2)

基本上,ρяσѕρєяK回答了你的问题。一些额外的细节:你不应该自己打电话给doInBackgroundAsyncTask的重点在于它管理将工作传递给后台工作线程并将结果返回给UI线程。 doInBackground返回的内容是onPostExecute作为参数收到的内容。

您的onPostExecute应如下所示:

@Override
protected void onPostExecute(String result) {
    MyBus.getInstance().post(new AsyncTaskResultEvent(result));
}