2015-12-22 33 views
1

我正在開發一個android應用。我有一個包含多個元素的列表視圖。我使用php腳本從mysql數據庫中獲取列表中的元素。但在獲取項目時,我的應用程序崩潰並且登錄cat顯示以下錯誤。這裏有什麼問題?Android應用 - 網絡任務錯誤

這是我的logcat輸出。

12-22 16:03:30.440: D/dalvikvm(1431): GC_FOR_ALLOC freed 233K, 8% free 3989K/4296K, paused 85ms, total 99ms 
12-22 16:03:32.070: I/Choreographer(1431): Skipped 219 frames! The application may be doing too much work on its main thread. 
12-22 16:03:32.610: D/AndroidRuntime(1431): Shutting down VM 
12-22 16:03:32.610: W/dalvikvm(1431): threadid=1: thread exiting with uncaught exception (group=0xb3a55ba8) 
12-22 16:03:32.690: E/AndroidRuntime(1431): FATAL EXCEPTION: main 
12-22 16:03:32.690: E/AndroidRuntime(1431): Process: com.example.orders, PID: 1431 
12-22 16:03:32.690: E/AndroidRuntime(1431): android.os.NetworkOnMainThreadException 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at java.net.Socket.connect(Socket.java:843) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at com.example.orders.JSONParser.makeHttpRequest(JSONParser.java:62) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at com.example.orders.EditProductActivity$GetProductDetails$1.run(EditProductActivity.java:132) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at android.os.Handler.handleCallback(Handler.java:733) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at android.os.Handler.dispatchMessage(Handler.java:95) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at android.os.Looper.loop(Looper.java:136) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at android.app.ActivityThread.main(ActivityThread.java:5001) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at java.lang.reflect.Method.invoke(Method.java:515) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
12-22 16:03:32.690: E/AndroidRuntime(1431):  at dalvik.system.NativeStart.main(Native Method) 
12-22 16:03:41.360: I/Process(1431): Sending signal. PID: 1431 SIG: 9 
12-22 16:03:42.990: D/gralloc_goldfish(1457): Emulator without GPU emulation detected. 

這裏是我的EditProductActivity

package com.example.orders; 


import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

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.168.1.31/test/get_product_details.php"; 

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

    // url to delete product 
    private static final String url_delete_product = "http://192.168.1.31/test/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

網絡操作在裏面'doInBackground()'爲什麼你在做'runOnUiThread()''GetProductDetails'的AsyncTask? –

+0

@Nigam Patro我從後臺更新UI線程 – colombo

回答

1

使用的AsyncTask或線程使用任何網絡相關的動作。這是因爲某些網絡操作可能被阻止,並且您的應用將無響應。如果您的網絡連接速度較慢,請將此次數乘以幾次。

有關服務,線程和異步任務之間的差異,請參閱此post

關於異步任務文檔,請參閱此link

編輯:我看到你在一個asyncTask中使用線程,但你也指定runOnUiThread,它打敗了擁有一個asynctask的目的。另外,一個AsyncTask已經是一個線程,所以不建議指定一個新的runnable。

// updating UI from Background Thread runOnUiThread(new Runnable() {

如果你看一下說明書, onPreExecuteonProgressUpdateonPostExecute已經在主線程,因此您也可以訪問您的產品細節和發佈更新。只要確保你只有在那裏獲取信息,並做doInBackground

+0

@Lara C非常感謝你,我改正了它 – colombo