java - android.os.NetworkOnMainThreadException 但我使用了 AsyncTask

标签 java android android-asynctask

我的类(class)使用 http 连接时遇到问题。错误是关于连接的,我读到该错误意味着我必须使用 AsyncTask,但我使用了它,但我的应用程序仍然无法运行。 这里有代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    new GetCoursesDetails().execute();
}
class GetCoursesDetails extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(InfoCorsi.this);
        pDialog.setMessage("Loading courses 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", pid));

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

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

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

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }
}

类 jSONParser 工作是因为我用它来为另一个类建立连接,在这种情况下的错误是 android.os.NetworkOnMainThreadException 类型:

1-18 13:44:46.478 23304-23318/? E/art: Failed sending reply to debugger: Broken pipe
11-18 13:44:53.635 23304-E/AndroidRuntime: FATAL EXCEPTION: main
11-18 13:44:53.635 23304-E/AndroidRuntime: Process: com.piemonteorientale.cus.cuspo, PID: 23304
11-18 13:44:53.635 23304-E/AndroidRuntime: android.os.NetworkOnMainThreadException
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at libcore.io.IoBridge.connect(IoBridge.java:122)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.net.Socket.connect(Socket.java:882)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at com.piemonteorientale.cus.cuspo.JSONParser.makeHttpRequest(JSONParser.java:62)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at com.piemonteorientale.cus.cuspo.InfoCorsi$GetCoursesDetails$1.run(InfoCorsi.java:89)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5290)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

最佳答案

doInBackground() 方法中删除 runOnUiThread()

关于java - android.os.NetworkOnMainThreadException 但我使用了 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33780807/

相关文章:

java - 由于某种原因确定字符串是否为空需要 2 个参数

android - 在 AsyncTask 类中设置 ListView 时出现问题

android.view.WindowLeaked 异常

java - Netty SystemD延迟初始化

java - 即使返回的 ArrayList 不为空,广度优先搜索也会返回空异常指针

java - 使用 Spring 3.x 的 CORS 实现

Android Google 登录 DEVELOPER_ERROR 10

android - 使用动态当前时间戳查询 firebase 数据

android - 在 Android Studio 2 模拟器上登录 Google 帐户挂起

android - 在哪里放置AsyncTask