2013-05-22 2 views
0

JSON을 사용하여 인터넷의 PHP 파일에서 데이터를 가져 오려고합니다. 그것은 정상적인 클래스에서 작동하지만 조각을 사용할 때 작동하지 않습니다.안드로이드 조각 http 응답

 public static class MagFragment extends Fragment { 
    public static final String ARG_MAGAZINE_NUMBER = "magazine_number"; 

    public MagFragment() { 
     // Empty constructor required for fragment subclasses 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     if(i != 0){ 
      rootView = inflater.inflate(R.layout.fragment_magazine, container, false); 
      TextView magText = (TextView) rootView.findViewById(R.id.textViewMag); 
      try { 

       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost("http://csddata.site11.com"); 
       HttpResponse response = httpclient.execute(httppost); 

       HttpEntity httpEntity = response.getEntity(); 
       InputStream inputstream = httpEntity.getContent(); 
       try{ 

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream,"iso-8859-1"),8); 
        magText.setText(reader.readLine()); 

       }catch (Exception e){ 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     return rootView; 
    } 
} 

정상적인 클래스에서 작동하므로 조각이기 때문에 사용해야합니다.

나는 오류를 복사하여 붙여 넣기가 뜨겁지 않지만 오류가 발생한 행을 말한 유일한 오류는 "HttpResponse response = httpclient.execute (httppost);"입니다. 선!

+0

그것은 할 수 있습니까? –

+0

Eclipse를 사용하는 경우 log cat으로 이동하여 복사 할 행을 선택하고 다른 것과 마찬가지로 복사 할 수 있습니다. 그리고 그 작동하지 않는 경우 오류의 첫 번째 줄을 적어도 다시 입력하십시오 ... – PearsonArtPhoto

+0

가능한 중복 [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os- networkonmainthreadexception) – Jave

답변

-7

나는 이유를 알아 냈다. 안드로이드 SDK 11 또한 예외를 통해 너무 네트워크 작업이 스레드에서 완료되면 대상 SDK를 제거하여 작동합니다.

+4

최악의 해결책 ... – WarrenFaith

+3

이것은 ** 매우 좋지 않은 해결책입니다. ** 안드로이드가 런타임 오류로 만들었던 ** 매우 ** 좋은 이유가 있습니다. 올바른 해결책은 내 대답을 참조하십시오. – PearsonArtPhoto

6

이전에는 UI 스레드에서 네트워크 작업을 수행하는 것이 매우 일반적이었습니다. 이런 일이 발생하면 응답이 매우 느리고 종종 예절을 예측하기가 어렵습니다. 이러한 일이 발생하지 않도록하기 위해 Google은 사용자가 UI 스레드에서 작업하는 것을 막았으며 나중에 AsyncTask 및 Threads와 같은 것을 사용하여 네트워크 정보를 얻고 나중에 데이터를 업데이트합니다.

작업을 수행하는 데 시간이 오래 걸리면 언제든지 UI 스레드가 아닌 스레드에서 작업해야합니다. 거기에서 작동하면 모든 종류의 문제가 발생할 수 있습니다. Android에서 런타임 오류가 발생했으며 때때로 성가신 수 있지만 그 이유는 NEVER대단히EVER 코드를 공개하려는 경우입니다. 특히 NEVER EVER UI 스레드에서 네트워크 작업을 수행하십시오 !!!!!! 귀하의 경우에는

는 적절한 솔루션 (... 아니 확인 구문하지만 가까워 야합니다) 이런 일이 :이 클래스는 정적이기 때문에

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
    if(i != 0){ 
     rootView = inflater.inflate(R.layout.fragment_magazine, container, false); 
     TextView magText = (TextView) rootView.findViewById(R.id.textViewMag); 
     new GetData("http://csddata.site11.com").execute(); 
    } 
} 

class GetData extends AsyncTask<String,Void,String> 
{ 
    protected String doInBackground(String... urls) { 
      String text=""; 
      try { 

       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(urls[0]); 
       HttpResponse response = httpclient.execute(httppost); 

       HttpEntity httpEntity = response.getEntity(); 
       InputStream inputstream = httpEntity.getContent(); 
       try{ 

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream,"iso-8859-1"),8); 
        text=reader.readLine(); 

       }catch (Exception e){ 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return textl 
    } 
    @Override 
    protect void onPostResults(String result) { 
     magText.setText(result); 
    } 
} 
+2

"네트워크 스레드에서 네트워크 작업을 절대로하지 마십시오 !!!!!!" 아마도 UI 스레드에서 네트워크 작업을 의미합니까? – Jave

+1

@ Jave : 좋은 캐치 ... – PearsonArtPhoto