2014-04-14 71 views
0

apears的錯誤是android.os.NetworkOnMainThreadException,這必須與runUithread應有的,但我不知道如何改變它。我已經在做一個asynctask我不明白。請幫幫我。Asynctask線程錯誤

/** 
* Background Async Task to Get complete product details 
* */ 
class GetProductDetails extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(EditProductActivity.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("id", id2)); 

        // getting product details by making HTTP request 
        // Note that product details url will use GET request 
        JSONObject json = jParser.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); 

         // product with this pid found 
         // Edit Text 
         txtdata1 = (EditText) findViewById(R.id.inputdt_ini); 
         txtdata2 = (EditText) findViewById(R.id.inputdt_fim); 
         txtDesc = (EditText) findViewById(R.id.inputDesc); 

         // display product data in EditText 
         txtdata1.setText(product.getString(TAG_DATA1)); 
         txtdata2.setText(product.getString(TAG_DATA2)); 
         txtDesc.setText(product.getString(TAG_DESCRICAO)); 

        }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(); 
    } 
} 

回答

1

你必須有,因爲你正在做runOnUiThread在後臺線程中執行的網絡操作,而不是UI線程。因此,網絡操作必須與UI視圖的更改分開。

而是執行以下操作(中繞了單程):

  1. 刪除您runOnUiThread
  2. 更改您的AsyncTaskAsyncTask<String, String, JSONObject>
  3. 返回的product的JSONObject在doInBackground
  4. onPostExecute可以在這裏修改您的看法product

因此,基本上這可以讓您的網絡操作全部在後臺線程中完成,一旦完成,它將返回productonPostExecute供您顯示。

實例與您的代碼(沒有測試但給你的總體思路,並沒有包括onPreExecute,因爲它在這個問題方面的關聯):

/** 
* Background Async Task to Get complete product details 
*/ 
class GetProductDetails extends AsyncTask<String, String, JSONObject> { 

    /** 
    * Getting product details in background thread 
    */ 
    protected JSONObject doInBackground(String... params) { 
     // Check for success tag 
     int success; 
     try { 
      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("id", id2)); 

      // getting product details by making HTTP request 
      // Note that product details url will use GET request 
      JSONObject json = jParser.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); 

       // instead return your product to onPostExecute 
       return product; 
      } else { 
       // product with pid not found 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * * 
    */ 
    protected void onPostExecute(JSONObject product) { 
     if (product != null) { 
      // product with this pid found 
      // Edit Text 
      txtdata1 = (EditText) findViewById(R.id.inputdt_ini); 
      txtdata2 = (EditText) findViewById(R.id.inputdt_fim); 
      txtDesc = (EditText) findViewById(R.id.inputDesc); 

      // display product data in EditText 
      txtdata1.setText(product.getString(TAG_DATA1)); 
      txtdata2.setText(product.getString(TAG_DATA2)); 
      txtDesc.setText(product.getString(TAG_DESCRICAO)); 
     } 

     // dismiss the dialog once got all details 
     pDialog.dismiss(); 
    } 
} 
0

你是如此接近....在撥打onUiThread()之前,請先做所有的工作以獲得您的數據(也就是說,創建JSONObject等)...您應該在onUiThread()中做的唯一一件事就是在您的文本視圖上調用setText()