0

我正在尝试从 MySQL 数据库中获取产品的详细信息,但是当我编译代码时,即使我在调用它时使用 GetProductDetails 作为 AsyncTask 类来执行,我也会收到 NetworkOnMainThreadException 错误。我真的不明白为什么会发生这种情况,因为我正在按照教程进行操作并且我没有看到任何错误。

这是我正在使用的代码:

public class ListClubs extends Activity {

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clubs);  
new GetProductDetails().execute(); 

(...some code...)    
}

class GetProductDetails extends AsyncTask<String, String, String> {
      @Override
      protected void onPreExecute() {
          super.onPreExecute();
          pDialog = new ProgressDialog(ListClubs.this);
          pDialog.setMessage("Loading product details. Please wait...");
          pDialog.setIndeterminate(false);
          pDialog.setCancelable(true);
          pDialog.show();
      }
    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        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("pid", Integer.toString(1))); 

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(url_product_detials, "GET", params);

                    // check your log for json response
                    Log.d("Single Product Details", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received product details
                        JSONArray productObj = json.getJSONArray(TAG_PRODUCT); // 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;
    }

    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }

 }

这是日志:

FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getAllByName(InetAddress.java:214)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.goout.JSONParser.makeHttpRequest(JSONParser.java:62)
at com.goout.ListClubs$GetProductDetails$1.run(ListClubs.java:464)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5227)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)

谢谢!

4

3 回答 3

1

把这些东西拿出来doInbackground()看看会发生什么

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

an 的重点AsyncTask是运行网络内容或任何繁重的工作,doInBackground()然后在需要时使用其他方法来更新UI。所以你不想做与它的目的相反的事情来告诉它的后台代码(doInbackground())在UI Threadwith上运行runOnUiThread()

此外,关于 AsyncTask Here 的非常好的信息

于 2013-08-22T20:27:21.997 回答
0

您再次将所有代码从 AsyncTask 编组到主 UI,这就是为什么现在好像 AsyncTask 不存在,一切都从 UI 线程运行。

提取您的网络代码以在 doInBackground 方法中运行并从中返回一个有意义的(对您的应用程序)类型,然后使用代码覆盖 onPostExecute 方法,该代码使用 doInBackground 的结果更新 UI。onPostExceute 总是从 Ui 线程运行,如果你正确使用它,你不需要自己管理线程。

更多信息:http: //developer.android.com/reference/android/os/AsyncTask.html

于 2013-08-22T20:31:05.457 回答
0

添加runOnUiThread您的doInBackground方法会导致您的后台线程将一个可运行对象排队到您的主线程,因此该可运行对象中的所有内容(包括您的网络任务)都在主线程上运行。在 Android (Honeycomb+) 中,这会导致您的异常被抛出。

如果您发现自己在处理AsyncTasks 和特别是网络请求方面遇到问题,请考虑查看一个库来帮助简化事情,例如droidQueryAndroid Volley

于 2013-08-22T20:43:50.097 回答