2015-05-24 3 views
-1

Вы можете увидеть три производных класса AsyncTask, которые являются внутренними для класса EditProductActivity. Этот класс позволяет мне получить информацию о продукте, когда я нахожусь в элементе списка в списке, тогда я могу редактировать детали продукта и сохранять его, или я могу его удалить. Однако, когда я делаю onclick элемент, макет «R.layout.edit_product» не появляется, и приложение останавливается.Использование AsyncTask, но приложение подавляет

LogCat говорит, что: android.os.NetworkOnMainThreadException

Кроме того, я стараюсь комментировать класс «GetProductDetails распространяется AsyncTask», появится макет «R.layout.edit_product», но я не могу получить продукт и когда я нажимаю кнопку «Сохранить», приложение снова раздавливается. Но функция удаления работает. Поэтому я думаю, что это проблема первого 2 производного класса AsyncTask: GetProductDetails и SaveProductDetails. Я бы попытался найти информацию о потоке пользовательского интерфейса и попытаться исправить проблему, но не удалось. Может ли кто-нибудь помочь? Спасибо !

EditProductActivity.java

public class EditProductActivity extends Activity { 

EditText txtName; 
EditText txtPrice; 
EditText txtDesc; 
EditText txtCreatedAt; 
Button btnSave; 
Button btnDelete; 

String pid; 

// Progress Dialog 
private ProgressDialog pDialog; 

// JSON parser class 
JSONParser jsonParser = new JSONParser(); 

// single product url 
private static final String url_product_detials = "http://192.128.0.101/android_connect/get_product_details.php"; 

// url to update product 
private static final String url_update_product = "http://192.128.0.101/android_connect/update_product.php"; 

// url to delete product 
private static final String url_delete_product = "http://192.128.0.101/android_connect/delete_product.php"; 

// JSON Node names 
private static final String TAG_SUCCESS = "success"; 
private static final String TAG_PRODUCT = "product"; 
private static final String TAG_PID = "pid"; 
private static final String TAG_NAME = "name"; 
private static final String TAG_PRICE = "price"; 
private static final String TAG_DESCRIPTION = "description"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.edit_product); 

    // save button 
    btnSave = (Button) findViewById(R.id.btnSave); 
    btnDelete = (Button) findViewById(R.id.btnDelete); 

    // getting product details from intent 
    Intent i = getIntent(); 

    // getting product id (pid) from intent 
    pid = i.getStringExtra(TAG_PID); 

    // Getting complete product details in background thread 
    new GetProductDetails().execute(); 

    // save button click event 
    btnSave.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // starting background task to update product 
      new SaveProductDetails().execute(); 
     } 
    }); 

    // Delete button click event 
    btnDelete.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // deleting product in background thread 
      new DeleteProduct().execute(); 
     } 
    }); 

} 

/** 
* 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("pid", pid)); 

        // 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); 

         // product with this pid found 
         // Edit Text 
         txtName = (EditText) findViewById(R.id.inputName); 
         txtPrice = (EditText) findViewById(R.id.inputPrice); 
         txtDesc = (EditText) findViewById(R.id.inputDesc); 

         // display product data in EditText 
         txtName.setText(product.getString(TAG_NAME)); 
         txtPrice.setText(product.getString(TAG_PRICE)); 
         txtDesc.setText(product.getString(TAG_DESCRIPTION)); 

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

/** 
* Background Async Task to Save product Details 
* */ 
class SaveProductDetails 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("Saving product ..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    /** 
    * Saving product 
    * */ 
    protected String doInBackground(String... args) { 

     // getting updated data from EditTexts 
     String name = txtName.getText().toString(); 
     String price = txtPrice.getText().toString(); 
     String description = txtDesc.getText().toString(); 

     // Building Parameters 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     params.add(new BasicNameValuePair(TAG_PID, pid)); 
     params.add(new BasicNameValuePair(TAG_NAME, name)); 
     params.add(new BasicNameValuePair(TAG_PRICE, price)); 
     params.add(new BasicNameValuePair(TAG_DESCRIPTION, description)); 

     // sending modified data through http request 
     // Notice that update product url accepts POST method 
     JSONObject json = jsonParser.makeHttpRequest(url_update_product, 
       "POST", params); 

     // check json success tag 
     try { 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       // successfully updated 
       Intent i = getIntent(); 
       // send result code 100 to notify about product update 
       setResult(100, i); 
       finish(); 
      } else { 
       // failed to update product 
      } 
     } 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 product uupdated 
     pDialog.dismiss(); 
    } 
} 

/***************************************************************** 
* Background Async Task to Delete Product 
* */ 
class DeleteProduct 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("Deleting Product..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    /** 
    * Deleting product 
    * */ 
    protected String doInBackground(String... args) { 

     // 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 
      JSONObject json = jsonParser.makeHttpRequest(
        url_delete_product, "POST", params); 

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

      // json success tag 
      success = json.getInt(TAG_SUCCESS); 
      if (success == 1) { 
       // product successfully deleted 
       // notify previous activity by sending code 100 
       Intent i = getIntent(); 
       // send result code 100 to notify about product deletion 
       setResult(100, i); 
       finish(); 
      } 
     } 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 product deleted 
     pDialog.dismiss(); 

    } 

} 
} 
+0

Я использую виджеты пользовательского интерфейса из фонового потока AsyncTask, чтобы проблема имеет место ? Если да, то как изменить код? –

+0

Дорогой Марцин Орловски, я думаю, что это связано, но совершенно по-другому. Почему вы говорите, что я делаю дублированный вопрос. Он спрашивает что-то об эмуляторе, но я не знаю. –

ответ

0

проблема THHE в том, что строки кода:

// 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); 

Причина вашей аварии является то, что этот код должен быть в другом потоке, то UI, только в doInBackground и будет работать

/** 
    * Getting product details in background thread 
    * */ 
    protected String doInBackground(String... params) { 
        int success = -1; 
        //Check for success tag 
        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 
         final JSONObject json = jsonParser.makeHttpRequest(
           url_product_detials, "GET", params); 

         // check your log for json response 
         Log.d("Single Product Details", json.toString()); 
         success = json.getInt(TAG_SUCCESS); 
         // json success tag 
        catch (JSONException e) { 
         e.printStackTrace(); 
        } 
        final int finalSuccess = success; 
        // updating UI from Background Thread 
        runOnUiThread(new Runnable() { 
        public void run() { 
        if (finalSuccess == 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 
         txtName = (EditText) findViewById(R.id.inputName); 
         txtPrice = (EditText) findViewById(R.id.inputPrice); 
         txtDesc = (EditText) findViewById(R.id.inputDesc); 

         // display product data in EditText 
         txtName.setText(product.getString(TAG_NAME)); 
         txtPrice.setText(product.getString(TAG_PRICE)); 
         txtDesc.setText(product.getString(TAG_DESCRIPTION)); 

        }else{ 
         // product with pid not found 
        } 
       } 
      } 
     }); 

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

Спасибо вам за ответ. Интересно, где я должен переместить код, если мне нужно выйти в doInBackground? Переместить в onPreExecute? или onPostExecute? или другие? –

+0

вам нужно просто __if (success == 1) __ и т. Д. Код в потоке пользовательского интерфейса, вы видите, потому что вы используете только виджеты пользовательского интерфейса, остальное просто выкладывается из UIThread и делает успех окончательным, вот и все –

+0

жаль, что я не может полностью понять. Вы хотите удалить код? или вы не возражаете, показывая мне, как должен выглядеть правильный метод doInBackground. Большое спасибо –

Смежные вопросы