我正在尝试构建我的第一个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,很难找到已经实现的解决方案...
对此的任何想法都会受到高度评价
答案 0 :(得分:2)
基本上,ρяσѕρєяK回答了你的问题。一些额外的细节:你不应该自己打电话给doInBackground
。 AsyncTask
的重点在于它管理将工作传递给后台工作线程并将结果返回给UI线程。 doInBackground
返回的内容是onPostExecute
作为参数收到的内容。
您的onPostExecute
应如下所示:
@Override
protected void onPostExecute(String result) {
MyBus.getInstance().post(new AsyncTaskResultEvent(result));
}