2014-02-22 3 views
1

저는 안드로이드를 처음 접했고 서버에 충돌하여 json 응답을 얻는 테스트 응용 프로그램을 개발했습니다. 여기NetworkOnMainThreadException AsyncTask의 자극

public class DownloadWebpageTask extends AsyncTask<String, Void, String> { 
@Override 
protected void onPostExecute(String result) { 
    ResultMainVO resultVO = new Gson().fromJson(result, ResultMainVO.class); 
    System.out.println("test" + resultVO); 
} 

@Override 
protected String doInBackground(String... urls) { 
    InputStream is = null; 
    StringBuilder builder = new StringBuilder(); 

    try { 
     URL url = new URL(urls[0]); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(10000 /* milliseconds */); 
     conn.setConnectTimeout(15000 /* milliseconds */); 
     conn.setRequestProperty("Accept", "*/*"); 
     conn.setDoInput(true); 
     conn.connect(); 
     is = conn.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      builder.append(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return builder.toString(); 
} 

}

가 나는 또한의 AndroidManifest.xml에 권한이

을 파일 - 추가 한은 - 내 주요 활동 -

public class MainPageActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.welcome_layout); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options_menu, menu); 
    MenuItem searchItem = menu.findItem(R.id.search); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

    SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      new DownloadWebpageTask().doInBackground("http://49.139.144.194:8080/ServerForMyAndroid/MusicServlet"); 
      return false; 
     } 
    }; 
    searchView.setOnQueryTextListener(queryTextListener); 
    return super.onCreateOptionsMenu(menu); 
} 

}

그리고 AsyncTask를 클래스입니다

나는 아래 excep를 얻는다. 기 나는 02-22 21 emulator-

에 응용 프로그램을 실행할 때 : 49 : 41.989 : E는/AndroidRuntime (734) : 치명적인 예외 : 주를 02-22 21 : 49 : 41.989 : E/AndroidRuntime (734) : android.os.NetworkOnMainThreadException 02-22 21 : 49 : 41.989 : E/AndroidRuntime (734) : android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1084)에서

답변

7

변경이

new DownloadWebpageTask().doInBackground("http://49.139.144.194:8080/ServerForMyAndroid/MusicServlet"); 

to

new DownloadWebpageTask().execute("http://49.139.144.194:8080/ServerForMyAndroid/MusicServlet"); 
+2

실제로, 호출하는 (아마도 UI) 스레드에서 실행하므로 백그라운드 메서드를 직접 호출하면 안됩니다. –

+0

고마워요. 어떻게 든 나는 이것을 놓쳤다! –