Android 网络处于AsyncTask和NetworkOnMainThreadException错误中

Android 网络处于AsyncTask和NetworkOnMainThreadException错误中,android,android-asynctask,android-networking,Android,Android Asynctask,Android Networking,我想从远程数据库获取一些数据,我的活动的AsyncTask子类中有一些网络,但当我尝试加载我的程序时,它显示NetworkOnMainThreadException 这是我的密码: public class MyMapLocationActivity extends MapActivity { private MapView mapView; private static String url_product_details = "http://myurl.com/readfromdb"; p

我想从远程数据库获取一些数据,我的活动的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");

    }
公共类MyMapLocationActivity扩展了MapActivity{
私有地图视图;
私有静态字符串url\u产品\u详细信息=”http://myurl.com/readfromdb";
私有静态最终字符串标记_SUCCESS=“SUCCESS”;
私有静态最终字符串标记_LATITUDE=“LATITUDE”;
私有静态最终字符串标记_LONGITUDE=“LONGITUDE”;
私有静态最终字符串标记_POINT=“POINT”;
JSONParser JSONParser=新的JSONParser();
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView=(mapView)findViewById(R.id.mapView);
mapView.SetBuilTinZoomControl(真);
ReadLocations Read=新的ReadLocations();
Read.execute();
}
//以及我的网络任务:
类ReadLocations扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…args){
Log.d(“调试”,“启动DOINBACKGROUND”);
runOnUiThread(新的Runnable(){
公开募捐{
//检查成功标签
成功;
试一试{
//建筑参数
List params=new ArrayList();
参数添加(新的BasicNameValuePair(“id”,“16”));
//通过发出HTTP请求获取产品详细信息
//请注意,产品详细信息url将使用GET请求
Log.d(“调试”,“在http请求之前”);
JSONObject json=jsonParser.makeHttpRequest(
url_产品_详细信息,“发布”,参数);
Log.d(“调试”,“http请求后”);
//json成功标记
success=json.getInt(TAG_success);
如果(成功==1){
//已成功接收产品详细信息
JSONArray productObj=json
.getJSONArray(标记点);//JSON数组
//从JSON数组中获取第一个产品对象
JSONObject product=productObj.getJSONObject(0);
}否则{
//找不到具有pid的产品
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
});
返回null;
}
@凌驾
受保护的void onPostExecute(字符串文本){
//完成后关闭对话框
Log.d(“调试”、“ONPOSTEXECUTE”);
}
LogCat显示“在http请求之前”,但不显示我的“在http请求之后”检查


有什么问题吗?

您的网络代码位于应用程序的mainuthread上,不在工作线程中

除去

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

并将WebRequest代码仅放在AsyncTask的
doInBackground()

更新:


实际上,您对
doInBackground()
AsyncTask实现是错误的。因为
doInBackground()
在工作线程中运行,执行冗长且与网络相关的操作。您正试图运行MainUiThread使用
runOnUiThread()形成它
这不在规则中。如果您想让任何与UI相关的工作在
onPostExecute()
onPreExecute()
和其他异步任务方法中完成。

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

除去

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

并将WebRequest代码仅放在AsyncTask的
doInBackground()

更新:


实际上,您对
doInBackground()
AsyncTask实现是错误的。因为
doInBackground()
在工作线程中运行,执行冗长且与网络相关的操作。您正试图运行MainUiThread使用
runOnUiThread()形成它
这不在规则中。如果您想使任何与UI相关的工作在
onPostExecute()
onPreExecute()中完成
和其他异步任务方法。

这是因为您在UI线程上运行网络代码…您的
doInBackground
在UI线程上显式运行网络代码。

这是因为您在UI线程上运行网络代码…您的
doInBackground
在UI线程上显式运行网络代码

试试这个代码:

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

           // 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; 
}
@覆盖
受保护的字符串doInBackground(字符串…args){
Log.d(“调试”,“启动DOINBACKGROUND”);
//检查成功标签
成功;
试一试{
//建筑参数
List params=new ArrayList();
参数添加(新的BasicNameValuePair(“id”,“16”));
//通过发出HTTP请求获取产品详细信息
//请注意,产品详细信息url将使用GET请求
Log.d(“调试”,“在http请求之前”);
JSONObject json=jsonParser.makeHttpRequest(
url_产品_详细信息,“发布”,参数);
Log.d(“调试”,“http请求后”);
//json成功标记
success=json.getInt(TAG_success);
如果(成功==1){
//已成功接收产品详细信息
JSONArray productObj=json
.getJSONArray(标记点);//JSON数组
//从JSON数组中获取第一个产品对象
JSONObject product=productObj.getJSONObject(0);
}否则{
//找不到具有pid的产品