2012-11-01 2 views
1

URL에서 Json 개체를 반환하는이 코드가 있습니다. froyo에서 제대로 작동하지만 동일한 코드가 Jelly Beans에서 작동하지 않습니다.코드가 Jelly Beans에서 작동하지 않습니다.

내 코드에 문제가 있습니까?

것은 제발 도와주세요, 여기에 내 코드

public static JSONObject getJSONfromURL(String url) { 

    // initialize 
    InputStream is = null; 
    String result = ""; 
    JSONObject jArray = null; 

    // http post 
    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(url); 
     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()); 
    } 

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

    return jArray; 
} 

여기에 당신은 메인 스레드의 네트워크 연결을 설정하려고

11-01 11:01:48.437: E/log_tag(1044): Error in http connection android.os.NetworkOnMainThreadException 11-01 11:01:48.437: E/log_tag(1044): Error converting result java.lang.NullPointerException 11-01 11:01:48.437: E/log_tag(1044): Error parsing data org.json.JSONException: End of input at character 0 of

+0

와 함께 갈 수있는 오류가 ? 그렇다면 게시하십시오. 네, 네트워크 관련 작업을 수행하고 있으므로 메인 스레드에서이 작업을 수행하지 않도록하십시오. [this] (http://android-developers.blogspot.in/2009/05/painless-threading.html) – juned

+0

무엇을합니까? "일하지 않는다"는 뜻입니까? –

+0

정확히 어떤 문제가 있는지 정확히 어떤 오류가 있는지 여부를 logcat 참조하십시오 ?? – Ravi

답변

1

Android API v15의 경우 메인 스레드에서 많은 처리가 필요하지 않습니다. 그래서 당신은 노호 소스 코드와 같은 다른 스레드에 논리를 이동해야합니다 :

new Thread(new Runnable() { 
    public void run() { 
     // your logic 
    }       
}).start(); 

상세 정보 http://developer.android.com/guide/practices/responsiveness.html

+0

당신은 Chirag Patel입니다. 별도 스레드로 작업을 나누어야합니다. – Antarix

+0

@Antarix 맞습니다. 문제가 해결되었다고 생각합니다. 어떤 질문입니까? – ckpatel

+0

네, 제 문제를 해결했습니다 ... 어떻게 UI를 업데이트 할 수 있습니까? 나는 로그에서 가치를 얻고있다. – Antarix

1

내 로그 오류입니다. 대신 AsyncTask을 사용하십시오. 네트워크 작업은 긴 작업이기 때문에. froyo에서는 메인 스레드에서 네트워크를 설정할 수 있지만 나중에 안드로이드 버전에서는 Async Task을 사용해야합니다.

1

백그라운드 스레드에서 서버 호출을합니다.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    new AsyncTask<Void,Void,Void>() { 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      JSONObject jObject = getJSONfromURL("http://query.yahooapis.com/v1/public/yql?q=select%20item%20from%20weather.forecast%20where%20location%3D%2248907%22&format=json"); 
      return null; 
     } 
    }.execute(); 
} 
public JSONObject getJSONfromURL(String url) { 

    // initialize 
    InputStream is = null; 
    String result = ""; 
    JSONObject jArray = null; 

    // http post 
    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(url); 
     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()); 
    } 

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

    return jArray; 
} 
1

그래 그 오류에 대한 android.os.NetworkOnMainThreadException 사용 AsyncTask 네트워크 관련 작업을 참조하십시오. 또 다른 방법으로

당신이 당신의 onCreate()

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

에이 코드를 사용하여이 비활성화 그러나 StrictMode 정책이 좋은 생각이 아니다 비활성화를 참조하십시오 그래서 당신은 더 나은 AsyncTask

관련 문제