NetworkOnMainThreadException AsyncTask onUIThread

时间:2015-08-09 17:56:14

标签: android android-asynctask

我得到“NetworkOnMainThreadException”.. :-( 所以..

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("id", id));

                        // 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
                            product = productObj.getJSONObject(0);

                            // product with this id found
                            // Edit Text

//                            new LoadTextFromJSONToTextViews().execute();
                            // display product data in EditText
                            productDetail1.setText(product.getString(OPTION_ONE));
                            productDetail2.setText(product.getString(OPTION_TWO));
                            productDetail3.setText(product.getString(OPTION_THREE));
                            productDetail4.setText(product.getString(OPTION_FOUR));
                            productDetail5.setText(product.getString(OPTION_FIVE));

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

我知道,我使用“runOnUiThread”执行此操作,但我必须这样做,因为如果不是,我将成为“只有创建视图层次结构的原始线程才能触及其视图。”这就是我为什么要添加额外的其中包含从上一个活动中单击的视图的ID到我要加载所单击视图的详细信息的位置。有人选择,如何在没有“runOnUIThread”的情况下解决这个问题?感谢您的回复: - )

4 个答案:

答案 0 :(得分:3)

AsyncTask中有3个主要功能:

1)onPreExecute
2)doInBackground
3)onPostExecute

您应该在doInBackground中进行所有网络通信,因为这将在后面的单独线程中完成。

当您想要更新UI时,可以在onPostExecute中执行此操作(在UI线程上自动调用此函数)。

要将信息从doInBackground发送到onPostExecute,您只需通过“返回数据”返回doInBackground中的数据;然后它就可以作为onPostExecute中的参数使用。

答案 1 :(得分:0)

如果你想对ui做任何事情,那么你应该使用onPostExecute()方法。 在onPostExecute()方法中添加代码。 从doInBackground(),只需更改成功变量的值...并在onPostExecute()中使用它作为if条件。

答案 2 :(得分:0)

onPreExecute(),onPostExecute(),onProgressUpdate()运行UI线程。 你可以用这种方法更新ui。

但是doInBackground()运行非ui线程。不要更新ui元素。

我修改了你的代码。

protected JSONObject doInBackground(String... params) {

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

        // 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());
        return json;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}


protected void onPostExecute(JSONObject result) {
    super.onPostExecute(result);
    int success;
    if(result!=null){
        try{
            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                JSONArray productObj = result
                        .getJSONArray(TAG_PRODUCT); // JSON Array
                // get first product object from JSON Array
                product = productObj.getJSONObject(0);

                // product with this id found
                // Edit Text
                // display product data in EditText
                productDetail1.setText(product.getString(OPTION_ONE));
                productDetail2.setText(product.getString(OPTION_TWO));
                productDetail3.setText(product.getString(OPTION_THREE));
                productDetail4.setText(product.getString(OPTION_FOUR));
                productDetail5.setText(product.getString(OPTION_FIVE));
            }else{

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

了解AsyncTask,请阅读此http://developer.android.com/reference/android/os/AsyncTask.html

答案 3 :(得分:-2)

您似乎使用以下代码触摸主UI线程:

// display product data in EditText
productDetail1.setText(product.getString(OPTION_ONE));
productDetail2.setText(product.getString(OPTION_TWO));
productDetail3.setText(product.getString(OPTION_THREE));
productDetail4.setText(product.getString(OPTION_FOUR));
productDetail5.setText(product.getString(OPTION_FIVE));

所以你只把它们放在runOnUiThread中:

protected String doInBackground(String... params) {

    (...)

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

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

        // product with this id found
        // Edit Text

        // new LoadTextFromJSONToTextViews().execute();
        // display product data in EditText
        runOnUiThread(new Runnable() {
            public void run() {
                // display product data in EditText
                productDetail1.setText(product.getString(OPTION_ONE));
                productDetail2.setText(product.getString(OPTION_TWO));
                productDetail3.setText(product.getString(OPTION_THREE));
                productDetail4.setText(product.getString(OPTION_FOUR));
                productDetail5.setText(product.getString(OPTION_FIVE));
            }
        });
    } else {

    (...)