2013-12-14 3 views
1

바코드 번호에 따라 MySQL 데이터베이스에서 제품을 가져 오려고합니다. 나는 그들이 작동하지만 안드로이드 측면에서 내 PHP 코드를 확인 오류가 발생했습니다. 여기 내 GetProductDetails 클래스 (이 부분은 괜찮다고 생각합니다.);Android Json HttpGet/Post HttpRespons

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; 
import android.widget.Toast; 

public class Query_product extends Activity { 
EditText txtId, txtName, txtPrice, txtDesc; 
Button btnSave, btnDelete; 
String ID = ""; 
String pid; 

// Progress Dialog 
private ProgressDialog pDialog; 


// Creating JSON Parser object 
JSONParser jsonParser = new JSONParser(); 


// url to get all products list 
private static final String url_product_details = "http://10.0.2.2/ssa/get_product_details.php"; 
private static final String url_update_product = "http://10.0.2.2/ssa/update_product.php"; 
private static final String url_delete_product = "http://10.0.2.2/ssa/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 = "barcode"; 
private static final String TAG_NAME = "name"; 
private static final String TAG_PRICE = "price"; 
private static final String TAG_DESCRIPTION = "description"; 

// products JSONArray 
JSONArray products = null; 

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

    btnSave = (Button) findViewById(R.id.btnSave); 
    btnDelete = (Button) findViewById(R.id.btnDelete); 



    ID += " " + getIntent().getExtras().getString(Constants.ID); 
    pid = ID; 



    new GetProductDetails().execute(); 
    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(); 
     } 
    }); 
} 

class GetProductDetails extends AsyncTask<String, String, String> { 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(Query_product.this); 
     pDialog.setMessage("Loading product details. Please wait..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    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(TAG_PID, pid)); 
        // getting product details by making HTTP request 
        // Note that product details url will use GET request 
        JSONObject json = jsonParser.makeHttpRequest(
          url_product_details, "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 
         txtId = (EditText) findViewById(R.id.inputId); 
         txtName = (EditText) findViewById(R.id.inputName); 
         txtPrice = (EditText) findViewById(R.id.inputPrice); 
         txtDesc = (EditText) findViewById(R.id.inputDesc); 

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

        } 
        else 
        { 

         String error = "Not found!"; 
         Toast.makeText(Query_product.this, error, Toast.LENGTH_LONG).show(); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     return null; 
    } 

여기에서 makeHttpRequest class;

public JSONObject makeHttpRequest (String url, String method, 
     List<NameValuePair> params) { 

    // Making HTTP request 
    try { 

     // check for request method 
     if(method == "POST"){ 
      // request method is POST 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     }else if(method == "GET"){ 
      // request method is GET 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      String paramString = URLEncodedUtils.format(params, "utf-8"); 
      url += "?" + paramString; 
      HttpGet httpGet = new HttpGet(url); 
      HttpResponse httpResponse = httpClient.execute(httpGet); 



      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 
     }   

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

} 
} 

나는이 문제를 해결할 수 없었다. 이 줄까지 프로그램이 실행됩니다.

HttpResponse httpResponse = httpClient.execute(httpGet); 

로그캣 오류;

12-14 18 : 05 : 30.994 : E는/AndroidRuntime (986) FATAL EXCEPTION : 메인 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) android.os.NetworkOnMainThreadException 12 -14 18 : 05 : 30.994 : E/AndroidRuntime (986) : android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1117) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : at libcore.io.BlockGuardOs.connect (BlockGuardOs.java:84) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : libcore.io.IoBridge.connectErrno (IoBridge.java:127) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : libcore.io.IoBridge.connect (IoBridge.java:112) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : java.net. PlainSocket Impl.connect (PlainSocketImpl.java:459) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : java.net.PlainSocketImpl.connect (PlainSocketImpl.java:459) 12-14 18:05 : 30.994 : E/AndroidRuntime (986) : java.net.Socket.connect (Socket.java:842) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : org.apache.http.conn. org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection (DefaultClientConnectionOperator.java:144)의 scheme.PlainSocketFactory.connectSocket (PlainSocketFactory.java:119) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:164) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : org.apache.http.impl.conn.AbstractPooledConnAdapter.open (AbstractPooledConnAdapter.java:119) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : org.apache.http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector.java:360) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:555) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : org.apache.http. impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:487) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java : 465) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : com.example.ssa.JSONParser.makeHttpRequest (JSONParser.java:66) 12-14 18 : 05 : 30.994 : E/AndroidRuntime 986) : com.example.ssa.Query_product $ GetProductDetails $ 1.run (Query_product.java:134) 12-14 18 : 05 : 30.994 : E/AndroidRunt (986) : android.os.Handler.handleCallback (Handler.java:725) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : android.os.Handler.dispatchMessage (Handler.java : 92) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : android.os.Looper.loop (Looper.java:137) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : android.app.ActivityThread.main (ActivityThread.java:5041) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : java.lang.reflect.Method.invokeNative에서 (네이티브 메소드) 12- 14 18 : 05 : 30.994 : E/AndroidRuntime (986) : java.lang.reflect.Method.invoke (Method.java:511) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 793) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) 12-14 18 : 05 : 30.994 : E/AndroidRuntime (986) : at dalvik.system.NativeStart.main (기본 메소드) 12-14 18 : 10 : 31.483 : I/Process (986) : 보내는 신호. PID : 986 SIG : 9 12-14 18 : 10 : 33.372 : D/gralloc_goldfish (1025) : GPU 에뮬레이션이없는 에뮬레이터가 감지되었습니다.

답변

3

네트워크 작업이 매우 오래 걸리면 응용 프로그램을 차단할 수 있으므로 주 스레드에서 네트워크 작업을 수행 할 수 없습니다. 대신 AsyncTask을 사용하여 백그라운드에서 이러한 작업을 실행해야합니다.

여기는 documentation입니다.

+0

감사를 사용해보십시오. AsyncTask에 JSONObject 메서드를 삽입 할 수있는 방법을 이해할 수 없습니다. 나는 안드로이드에 새로 왔어. – user3102822

+0

@ user3102822 샘플 코드가 필요합니까? – Octoshape

+0

예. 고맙습니다. – user3102822

0

오류가 json이 아닌 것 같습니다. android 4.0에서 허용되지 않는 Main Thread에서 URL을 호출하려고합니다. AsynTask를 사용하거나 보조 스레드에서 url을 호출 해보십시오.

1

있습니다 .. networkOnmainThread 예외를 방지하기 위해, setContentView() 아래의 주요 활동 내에서 아래의 코드를 사용하여 답변을

if (android.os.Build.VERSION.SDK_INT > 9) { 
       StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
       StrictMode.setThreadPolicy(policy); 
      }