1

非同期タスクを使用してスレッドと並行していくつかのコードを実行しようとしています。しかし、何らかの理由でアンドロイド 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) {


    }
}
 }

Android 2.3.3 では、logcat はこのシーケンスを示します

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

しかし、Android 4.2.2ではのみ表示されます

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

スレッドが機能しない理由はありますか?

4

2 に答える 2

3

これは、AsyncTasks が API 3 での概念以来進化してきた方法と関係がありますAPI 3。これはスレッドのプールに変更され、複数の AsyncTask を並行して実行できるようになりました ( API 4(DONUT))。しかし、開始するHONEYCOMB(API 11)と、AsyncTasks はシリアルに実行されるように戻ります。

あなたが提供した出力を見ると、> DONUT と < HONEYCOMBSendTaskDownloaderTask場合、両方が並行して実行されます。2.3.3ただし、 の場合、4.2.2AsyncTasks のシリアル実行が行われます。が最初に実行されるためDownloaderTask、SendTask は実行が終了するのを待ちます (これは while(true) のおかげで発生しません) --> したがって、出力はありません。

API 11 以降、AsyncTasks をシリアルで実行するか、並列で実行するかを選択できます。シリアル実行の場合は、 を使用しますexecute(Params... params)。並列実行については、 を参照してexecuteOnExecutor(Executor exec, Params... params)ください。

于 2013-07-23T02:30:42.057 に答える
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

AsyncTasks はThreadPool、制御できない によってサポートされています。AsyncTaskニーズに合わない場合は、サービスを使用するLoopersか、独自のThreadPoolExecutor. AsyncTask は、無期限にループするようには設計されていません。つまり、サーバーまたはサービスになります。

つまり、Android バージョンでは、プールから最初にエンキューされたスレッドのみが実行され、終了しないため (順次実行されます)、2 番目のスレッドは開始されません。

于 2013-07-23T02:16:31.110 に答える