android - 网络处于 AsyncTask 和 NetworkOnMainThreadException 错误

标签 android android-asynctask android-networking

我想从远程数据库获取一些数据,并且我的 Activity 的 AsyncTask 子类中有一些网络,但是当我尝试加载我的程序时,它显示 NetworkOnMainThreadException。

这是我的代码:

public class MyMapLocationActivity extends MapActivity {

private MapView mapView;
private static String url_product_details = "http://myurl.com/readfromdb";
private static final String TAG_SUCCESS = "success";
private static final String TAG_LATITUDE = "latitude";
private static final String TAG_LONGITUDE = "longitude";
private static final String TAG_POINT = "point";

    JSONParser jsonParser = new JSONParser();

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main); 

    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);

    ReadLocations Read = new ReadLocations();
    Read.execute();
}

//And my networking AsyncTask:

class ReadLocations extends AsyncTask<String, String, String> {


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }


   @Override
    protected String doInBackground(String... args) {
       Log.d("debug", "START DOINBACKGROUND");


       runOnUiThread(new Runnable() {
           public void run() {
               // Check for success tag
               int success;
               try {

                   // Building Parameters
                   List<NameValuePair> params = new ArrayList<NameValuePair>();
                   params.add(new BasicNameValuePair("id", "16"));

                   // getting product details by making HTTP request
                   // Note that product details url will use GET request
                   Log.d("debug", "before http request");

                   JSONObject json = jsonParser.makeHttpRequest(
                           url_product_details, "POST", params);
                   Log.d("debug", "after http request");

                   // json success tag
                   success = json.getInt(TAG_SUCCESS);

                   if (success == 1) {
                       // successfully received product details
                       JSONArray productObj = json
                               .getJSONArray(TAG_POINT); // JSON Array

                       // get first product object from JSON Array
                       JSONObject product = productObj.getJSONObject(0);

                   }else{
                       // product with pid not found
                   }
               } catch (JSONException e) {
                   e.printStackTrace();
               }
           }
       });

        return null; 
    }



  @Override
    protected void onPostExecute(String text) {
        // dismiss the dialog once done
   Log.d("debug", "ONPOSTEXECUTE");

    }

LogCat 显示“http 请求之前”但不显示我的“http 请求之后”检查。

怎么了?

最佳答案

您的网络代码在应用程序的 MainUiThread 上,而不是在工作线程中...

删除

runOnUiThread(new Runnable() {
           public void run() {

来自 doInBackground()

并且只将WebRequest代码放在AsyncTask的doInBackground()中..

更新:

实际上,您对 doInBackground()AsyncTask 实现是错误的。由于 doInBackground() 在工作线程中运行以进行冗长的网络相关操作。并且您正在尝试使用 runOnUiThread() 运行 MainUiThread 形成它,这不符合规则。如果您想进行任何与 UI 相关的工作,请在 onPostExecute 中执行()onPreExecute()等ASyncTask方法

关于android - 网络处于 AsyncTask 和 NetworkOnMainThreadException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12494902/

相关文章:

android - 如何使用 Android 帐户管理器处理刷新 token

android - 从网络设备的 IP 地址列表中查找打印机 IP 地址

android - 将已解析的 Json 数据更新到 Listview

android - 阻止 Google Play 自动翻译我的应用说明

android - 带异步任务和自定义适配器的 ListFragment

android - 使用 AsyncTask 下载多个文件的问题

java - Android 在发出多个 http 请求时增加堆 fragment 情况

android - 如何在 Retrofit GET 请求中发送对象参数?

安卓同步适配器 : how to get notified of specific sync happened

java - 如何为 Android 5.0 构建我的纯 Java (Swing) 应用程序?