2013-10-04 5 views
-1

я следовал этому учебник для реализации Crud PHP MySQL андроид приложения , но когда я та или иная строчка андроида проект и я нажимаю на один пункт из списка продуктов У меня есть эта ошибка:android.osnetworkonmainthreadexception даже если у меня есть AsyncTask

android.osNetworkOnMainthreadException 

вот AsyncTask doinbackground:

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

Я удалил runOnUithread но генерировать мне другую ошибку

как можно исправить эту проблему

+0

runOnUiThread -> NetworkOnMainthreadException. – njzk2

ответ

1

Удалить runOnUiThread.

Убрать этот код:

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

и добавить его в onPostExecute, но вам придется отредактировать AsyncTask вернуть объект product и использовать его в onPostExecute.

Очень быстрое решение было бы поставить код, упомянутый выше в runOnUiThread.

+0

ОК, я проверю ваше предложение – begiPass

+0

спасибо, Шериф, я просто поместил код, упомянутый выше в runOnUiThread, и он работает – begiPass

+0

Да, но правильным способом было бы изменить вашу Asynctask на 'AsyncTask '. Затем в doInBackgroud вы должны вернуть 'product'. В 'onPostExecute' (вместо doInBackground) вы можете использовать приведенный выше код без runOnUiThread –

0

Вам не нужно делать runOnUiThread внутри doInBackground(), так как вам просто нужно отобразить информацию о продукте, которую вы можете прямо сделать внутри onPostExecute().

Try следующие шаги:

  1. Возвращенный продукт JSONObject из doInBackground().
  2. Получите JSONObject внутри onPostExecute() и получите любые детали, которые вы хотите от него. Теперь вы можете написать код для отображения и обновления кода пользовательского интерфейса здесь в onPostExecute():
txtName.setText(product.getString(TAG_NAME)); 
txtPrice.setText(product.getString(TAG_PRICE)); 
txtDesc.setText(product.getString(TAG_DESCRIPTION)); 
0

ли разделить свою работу.

  1. Удалить runOnUiThread из doInbackground и дать ему сделать httpRequest и проанализировать ответ и вернуть ответ.
  2. использовать onPostExecute для обновления ui в соответствии с ответом.
Смежные вопросы