2013-06-01 3 views
0

두 개의 asynctask 클래스를 정의합니다. 첫 번째 작업이 끝난 후 실행 된 두 번째 작업이 필요하므로 첫 번째 작업의 OnPostExecute()에서Android : 두 개의 asynctask를 실행할 때 NetworkOnMainThreadException이 표시됩니다.

new SecondTask(...).execute(); 

을 호출합니다.

그러나 "android.os.NetworkOnMainThreadException"이 표시됩니다. 왜?

업데이트 일부 코드 :

private class FirstTask extends AsyncTask<Void, Void, HttpResponse> { 
    ... 
    @Override 
    protected HttpResponse doInBackground(Void... arg0) { 
     ... 
    } 
    @Override 
    protected void onPostExecute(HttpResponse result) { 
     Reader reader = new InputStreamReader(result.getEntity().getContent()); 
     ... 
     HttpUriRequest arg0 = new HttpGet(...); 
     new SecondTask(arg0).execute(); 
    } 
} 

private class SecondTask extends AsyncTask<Void, Void, HttpResponse> { 

    private HttpUriRequest request; 

    public ClickRequest(HttpUriRequest req) { 
     this.request = req; 
    } 

    @Override 
    protected HttpResponse doInBackground(Void... arg0) { 
     // TODO Auto-generated method stub 
     try { 
      HttpResponse response = httpClient.execute(request); 
      return response; 
     } catch (IOException e) { 
      return null; 
     } 
    } 
} 

스택 추적은 :

06-01 20:19:21.726: D/AdlibView(1241): android.os.NetworkOnMainThreadException 
06-01 20:19:21.726: D/AdlibView(1241): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
06-01 20:19:21.726: D/AdlibView(1241): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163) 
06-01 20:19:21.726: D/AdlibView(1241): at libcore.io.IoBridge.recvfrom(IoBridge.java:513) 
06-01 20:19:21.726: D/AdlibView(1241): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
06-01 20:19:21.726: D/AdlibView(1241): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
06-01 20:19:21.726: D/AdlibView(1241): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
06-01 20:19:21.726: D/AdlibView(1241): at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
06-01 20:19:21.726: D/AdlibView(1241): at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
06-01 20:19:21.726: D/AdlibView(1241): at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:220) 
06-01 20:19:21.726: D/AdlibView(1241): at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:183) 
06-01 20:19:21.726: D/AdlibView(1241): at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:155) 
06-01 20:19:21.726: D/AdlibView(1241): at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159) 
06-01 20:19:21.726: D/AdlibView(1241): at java.io.InputStreamReader.read(InputStreamReader.java:244) 
06-01 20:19:21.726: D/AdlibView(1241): at java.io.Reader.read(Reader.java:145) 
06-01 20:19:21.726: D/AdlibView(1241): at edu.stanford.cs.adlib.AdLibView$1.onPostExecute(AdLibView.java:41) 
06-01 20:19:21.726: D/AdlibView(1241): at edu.stanford.cs.adlib.AdLibView$1.onPostExecute(AdLibView.java:1) 
06-01 20:19:21.726: D/AdlibView(1241): at android.os.AsyncTask.finish(AsyncTask.java:631) 
06-01 20:19:21.726: D/AdlibView(1241): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
06-01 20:19:21.726: D/AdlibView(1241): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
06-01 20:19:21.726: D/AdlibView(1241): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-01 20:19:21.726: D/AdlibView(1241): at android.os.Looper.loop(Looper.java:137) 
06-01 20:19:21.726: D/AdlibView(1241): at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-01 20:19:21.726: D/AdlibView(1241): at java.lang.reflect.Method.invokeNative(Native Method) 
06-01 20:19:21.726: D/AdlibView(1241): at java.lang.reflect.Method.invoke(Method.java:511) 
06-01 20:19:21.726: D/AdlibView(1241): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-01 20:19:21.726: D/AdlibView(1241): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-01 20:19:21.726: D/AdlibView(1241): at dalvik.system.NativeStart.main(Native Method) 
+1

내에서 실행해야합니다. http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception. 또한 http://developer.android.com/reference/android/os/AsyncTask.html을 확인하십시오. 관련 코드 게시 – Raghunandan

+0

당신은 내 질문에 대답하지 않습니다. 메인 ui 스레드에서 네트워크 작업을 실행할 수 없으므로 asynctasks를 사용합니다. 하지만 왜 내가 첫 번째 OnPostExecute()에서 두 번째 작업을 실행할 수 없는지 이해할 수 없습니다. – yoarcher

+0

두 번째 asynctask를 게시하십시오. – Blackbelt

답변

2
protected void onPostExecute(HttpResponse result) { 
    Reader reader = new InputStreamReader(result.getEntity().getContent()); 

는 여기에서 HttpResponse에 데이터를 읽고있다. 이것은 메인 스레드에 있습니다. 모든 네트워크 관련 코드를 onPostExecute() 밖으로 이동해야합니다.

+0

고마워요. 너는 나의 날을 구한다. =) – yoarcher

1
Reader reader = new InputStreamReader(result.getEntity().getContent()); 

이 조작 해, InputStream에 관련된 모든 작업은 메인 UI 스레드에서 네트워크 관련 작업을 실행하는 doInBackground

+0

위대한 설명! 많은 감사합니다. – yoarcher

관련 문제