我正在尝试构建我的第一个Android应用程序,它使用AsyncTask执行POST请求(以登录网站)。
在关闭StrictMode时,我的应用程序可以正常工作,但是我希望在StrictMode下执行时也能无误。尽管我使用AsyncTask重新设计了我的应用程序,但它仍然给出以下错误:
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
从我在互联网上读到的内容来看,使用AsyncTask应该可以解决这个问题。我不想使用Java线程,因为我想学习正确的方法。
我建立了一个新类来执行任务,它叫做MyAsyncTask,下面是类代码:
<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,但在已实现时很难找到解决方案... 对此有何想法将不胜感激。
MyBus.getInstance().post(new AsyncTaskResultEvent(doInBackground()));
这行代码在onPostExecute
中引起问题,因为onPostExecute
总是在 UI 线程上运行,而你正在从onPostExecute
中调用doInBackground
。 - ρяσѕρєя KMyBus.getInstance().post(new AsyncTaskResultEvent(doInBackground()));
这一行,会发生什么? - ρяσѕρєя K