2013-07-23 7 views
1

비동기 작업을 사용하는 스레드로 코드 평행선을 실행하려고합니다. 하지만 안드로이드 4.2.2에서 어떤 이유로 작동하지 않습니다 .... ....................AsyncTask in android 4.2.2

나는이 코드를 가지고 있습니다 메인 클래스 :

new XmlDownloader(); 

task=new SendTask().execute(""); 

다음과 같은 클래스 :

private class SendTask extends AsyncTask<String,String,String>{ 



     @Override 
     protected void onPreExecute(){ 

     } 

     @Override 
     protected String doInBackground(String...strings){ 

       while(true){        

        Log.w("outside", "hello"); 
      }    
      } 

      return strings[0]; 
     } 

     @Override 
     protected void onPostExecute(String country){ 


     } 
    } 

public class XmlDownloader extends Activity { 


public XmlDownloader(int pos) { 


    DownloaderTask task = new DownloaderTask(); 

    task.execute(""); 
} 


private String downloadXml(String s,int pos1) { 

    return null; 
} 


private class DownloaderTask extends AsyncTask<String, Void, String> { 

    public DownloaderTask() { 

    } 

    @Override 
    // Actual download method, run in the task thread 
    protected String doInBackground(String... params) { 

     while(true){ 
      Log.w("down", "asdasdasssasdasdasdasd"); 
      if(isCancelled()) 
       return null; 
     }; 


     return null; 

    } 

    @Override 
    // Once the image is downloaded, associates it to the imageView 
    protected void onPostExecute(String bitmap) { 


    } 
} 
} 

내가 그것을 알고 while 루프하지만, 프로그램이 순서

Log.w("down", "asdasdasssasdasdasdasd"); 
Log.w("down", "asdasdasssasdasdasdasd"); 
Log.w("down", "asdasdasssasdasdasdasd");  
Log.w("outside", "hello"); 
Log.w("outside", "hello"); 
Log.w("down", "asdasdasssasdasdasdasd"); 

하지만 안드로이드 4.2.2에서 스레드가 작동하지 않는 이유 만

Log.w("down", "asdasdasssasdasdasdasd"); 
    Log.w("down", "asdasdasssasdasdasdasd"); 
    Log.w("down", "asdasdasssasdasdasdasd"); 
    Log.w("down", "asdasdasssasdasdasdasd"); 
    Log.w("down", "asdasdasssasdasdasdasd"); 

어떤 아이디어를 보여줍니다 로그 캣 moment.In 안드로이드 2.3.3 나 맨 손으로?

+1

"작동하지 않음"이란 정확히 무엇을 의미합니까? – asgs

+0

시퀀스가 ​​잘못되었습니다. 직렬 실행을 좋아하고 병렬 실행을 원합니다.비동기가 스레드를 생성하기 때문에 이상합니다. 내가 말했듯이 2.3.3에서 잘 작동합니다. – Tony

+0

제 대답을보세요. 나는 그것을 편집했고, 왜 일어 났는지에 대한 답을 찾을 수 있습니다 ... 두 번째 스레드를 먼저 시작하면 다른 문자열 만 인쇄됩니다. –

답변

3

AsyncTask을 사용하면 필요한 병렬 처리를 제공하지 못할 수도 있습니다. 여러 Android 버전에서 동시에 실행할 수있는 AsyncTask의 수가 1에서 5로 변경된 다음 다시 1로 변경되었습니다 (잘못된 것이 아니라면).

https://github.com/android/platform_frameworks_base/commits/master/core/java/android/os/AsyncTask.java

https://groups.google.com/forum/?fromgroups#!topic/android-developers/8M0RTFfO7-M

AsyncTask

은 당신이 통제 할 수없는 통해 ThreadPool에 의해 백업됩니다. AsyncTask이 귀하의 필요에 맞지 않으면 서비스 또는 Loopers을 사용하거나 직접 ThreadPoolExecutor을 작성하는 것입니다. AsyncTask는 서버 또는 서비스가되도록 이상적으로 반복하도록 설계되지 않았습니다.

그래서 안드로이드 버전에서는 풀의 첫 번째 대기열에있는 스레드 만 실행되고 종료되지 않으므로 (순차적으로 실행됩니다) 두 번째 것이 결코 시작되지 않습니다.

+0

그럼이 작품을 만들기 위해 정확히 무엇을 제안 하시겠습니까? – Tony

+0

그것은 당신이 원하는 것을 바꿈에 달려 있습니다 ... 그 예제가 작동하려면 단순히 두 개의 Thread를 사용하십시오. UI에 게시해야하는 경우 처리기를 스레드에 전달합니다. ThreadPoolExecutor는 동시에 실행할 수있는 스레드 수와 인스턴스화 할 수있는 최대 스레드 수를 제어하는 ​​데 사용됩니다. 내가 말했듯이 그것은 당신의 필요에 기초합니다. –

+1

두 개 이상의 스레드가있는 고유 한 Executor를 지정할 수있는 AsyncTask.executeOnExecutor (...) 메서드도 있습니다. – toto2

3

이것은 API 3에서 생각한대로 AsyncTasks가 진화 한 방식과 관련이 있습니다. API 3에서 AsyncTasks (복수형)가 순차적으로 실행되었습니다. 이것은 스레드 풀로 변경되어 여러 AsyncTasks를 병렬로 실행할 수 있습니다 (API 4(DONUT)). 그러나 HONEYCOMB(API 11)을 시작하면 AsyncTasks가 순차적으로 실행됩니다. 사용자가 제공 한 출력 찾고

모두 SendTask & DownloaderTask는> 도넛 < HONEYCOMB이다 2.3.3 경우 병렬로 실행한다. 그러나 4.2.2의 경우 AsyncTasks의 직렬 실행이 발생합니다. DownloaderTask이 먼저 실행되기 때문에 SendTask는 실행이 끝날 때까지 기다립니다 (while (true) 덕분에 발생하지 않음) -> 따라서 출력이 없습니다.

API 11부터 AsyncTasks를 직렬로 또는 병렬로 실행할지 여부를 선택할 수 있습니다. 직렬 실행의 경우 execute(Params... params)을 사용하십시오. 병렬 실행을 위해서는 executeOnExecutor(Executor exec, Params... params)을 살펴보십시오.

+0

좋은 설명. 감사! – asgs