如何使用 AsyncTask 修复 Android 中的 NetworkOnMainThreadException

How to fix NetworkOnMainThreadException in Android by using AsyncTask

当我写这段代码时它给出了 NetworkOnMainThreadException 所以我想用 AsyncTask 来实现它虽然我已经看到很多关于这个错误的问题和答案但无法编写它。我想将参数传递给 Asynctask class 并想将返回的数据分配给当前 class 中的变量。请您帮帮我。这是我的代码

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    int tem = 1940+position;
    String temp = ""+tem;
    String ReceivedData ="<";
    GettingInternetData something = new GettingInternetData(temp);
    try {
        ReceivedData = something.getMoviesData();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

GettingInternetData.java

public class GettingInternetData {

    String y = null;
    public GettingInternetData(String year) {
        // TODO Auto-generated constructor stub
        y = year;
    }
public String getMoviesData() throws Exception
{
    BufferedReader toRead = null;
    String data = null;
    try
    {
        HttpClient client = new DefaultHttpClient();
        URI url = new URI("URL goes here which requires an argument temp");
        HttpGet getting = new HttpGet();
        getting.setURI(url);
        HttpResponse resp = client.execute(getting);
        toRead = new BufferedReader(new InputStreamReader(resp.getEntity().getContent()));
        StringBuffer alldata = new StringBuffer();
        String l ="";
        String nl = System.getProperty("line.Separator");
        while((l = toRead.readLine()) !=null)
        {
            alldata.append(l + nl);
        }
        toRead.close();
        data = alldata.toString();
        return data;
    }
    finally{
        if (toRead != null){
            try{
                toRead.close();
                return data;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
}
}

提前致谢

您需要将参数传递给您的自定义 AsyncTask,让它在 doInBackground() 方法中完成工作并 return 任何结果。然后,您可以在 onPostExecute() 方法中处理结果。有关 AsyncTask 的更详细说明,您可能会发现这篇文章很有帮助:http://po.st/Cei3m2

试试这个

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    new InternetAsynTask().execute(String.valueOf(1940+position));
}

public static class InternetAsynTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        GettingInternetData gettingInternetData = new GettingInternetData(params[0]);
        return gettingInternetData.getMoviesData();
    }

    @Override
    protected void onPostExecute(String s) {
        // TODO:
        // processing receive data here
    }
}

首先,您不应该从您的应用程序主线程调用任何通过互联网获取或发送信息的服务。os。所以,你可以使用 android os provided asynctask.Also,你告诉那个,你想将信息传递给 asynctask。我认为它会帮助你, private class SyncWithServerTask extends AsyncTask<VALUE, Void, String> { protected Long doInBackground(VALUE... values) { int count = valus.length; for (int i = 0; i < count; i++) { publishProgress((int) ((i / (float) count) * 100)); //HERE YOUR CODE // Escape early if cancel() is called if (isCancelled()) break; } return result; }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(String result) {
     showDialog(result);
 }

}

然后,调用您的服务,使用, new SyncWithServerTask().execute(value1, value2, value3);