2013-04-03 4 views
-2
04-02 21:59:03.086: E/log_tag(27382): Error in http connection android.os.NetworkOnMainThreadException 
04-02 21:59:03.106: E/log_tag(27382): Error converting result java.lang.NullPointerException 
04-02 21:59:03.106: E/log_tag(27382): Error parsing data org.json.JSONException: End of input at character 0 of 
다음 코드에서

:내 응용 프로그램을 내 서버에 연결하려고합니다. 그러나 이러한 오류가 발생합니다. MainThreadException을 어떻게 수정합니까?

package net.example.glutefree; 

import android.app.Activity; 
import android.os.Bundle; 
import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.util.Log; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class Networking extends Activity { 
    TextView txt; 
    int request_Code = 1; 
//called when activity is first created 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_networking); 
     // Create a crude view - this should really be set via the layout resources 
     // but since its an example saves declaring them in the XML. 
     LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
     txt = new TextView(getApplicationContext()); 
     rootLayout.addView(txt); 
     setContentView(rootLayout); 
     // Set the text and call the connect function. 
     txt.setText("Connecting..."); 
     //call the method to run the data retreival 
     txt.setText(getServerData(KEY_121)); 
    } 

    public static final String KEY_121 = "http://WEBSITE/application_query.php"; 

    private String getServerData(String returnString) { 
     String UPC = getIntent().getStringExtra("UPCA"); 
     InputStream is = null; 
     String result = ""; 
     //the upc data to send 
     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

     nameValuePairs.add(new BasicNameValuePair("UPCA",UPC)); 

     //http post 
     try{ 

       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(KEY_121); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 

     } catch(Exception e) { 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
     } 

     //convert response to string 
     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(); 
       result=sb.toString(); 
     } catch(Exception e) { 
       Log.e("log_tag", "Error converting result "+e.toString()); 
     } 
     //parse json data 
     try { 
       JSONArray jArray = new JSONArray(result); 
       Log.e("log_tag", "Result "+result.toString()); 
       for(int i=0;i<jArray.length();i++) { 
         JSONObject json_data = jArray.getJSONObject(i); 
         Log.i("log_tag","UPCA: "+json_data.getString("UPCA")+ 
           ", Product: "+json_data.getString("Product")); 
         //Get an output to the screen 
         returnString += "\n\t" + jArray.getJSONObject(i); 
       } 
     } catch(JSONException e) { 
       Log.e("log_tag", "Error parsing data "+e.toString()); 
     } 
     return returnString; 
    } 

} 
+0

RTM : http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html. 깨달음이 있습니다. –

+1

이것은 공통적 인 대답이있는 개념적 문제입니다. 코드를 게시하기 전에 그 코드의 오류를 조사해 보시기 바랍니다. 개념적으로는 같은 문제입니다. @ user2238600 – JoxTraex

+0

다른 하나와 너무 흡사하다는 것을 알았습니다. 사과드립니다. @JoxTraex를 게시하기 전에 더 많은 조사를 해보겠습니다. – rmushero

답변

1

사용

new Thread() { 
    public void run() { 
     final String data = getServerData(KEY_121); 
     if (data != null) 
      runOnUiThread(new Runnable() 
      { 
       public void run() 
       { 
        txt.setText(data); 
       } 
      }); 
    } 
}.start(); 

대신의 :

//call the method to run the data retreival 
txt.setText(getServerData(KEY_121)); 

당신은 주 스레드에서 오래 작업을 실행할 수 없습니다. 그러나 UI 스레드를 사용하여 텍스트를 설정해야합니다.

0

문제는 당신은 UI 스레드에서 네트워크 요청 (getServerData())을 실행하기 위해 노력하고 있다는 점이다. ANR을 피하기 위해 허용되지 않습니다 (예 : 네트워크 연결이 없거나 응답이 느린 경우).

네트워크 관련 작업을 위해 스레드를 준비하는 방법에 대한 정보는 painless threading 문서를 참조하십시오. 그런 다음 네트워크 작업이 필요한 모든 코드를 별도의 스레드로 이동하십시오.

0

문제는 당신이 UI 스레드에서 네트워크 연결을 수행하는 것입니다 : 내가 여기 AsyncTasks에 대한 문서가의

new AST(this).execute; //assuming you've created an AsyncTask class called AST 

를 호출하여 메인 스레드 작업에서 실행할 수있는 AsyncTask를을 만드는 것이 좋습니다 것입니다. 성능과 사용자 경험을 위해 Android는이를 허용하지 않습니다. 스레드에서 getServerData()를 둘러보십시오.

new Thread() { 
    public void run() { 
     getServerData(); 
    } 
}.start(); 
0

Android 앱의 기본 스레드에서 네트워크 활동을 수행하지 않아도됩니다. 그것을 위해 새 스레드를 포크해야합니다.

this을 참조하십시오.

0

모든 Android 버전 3.0 이상에서는 UI 스레드 (기본 스레드)에서 네트워크 호출을하면 해당 예외가 throw되어 앱이 즉시 중단됩니다.

대신 AsyncTask에 하위 클래스를 만들고 거기에서 getServerData 메서드를 호출해야합니다.

Here은 주제에 관한 공식 블로그 게시물입니다.

체크 아웃 AsyncTask를 here