2016-12-13 1 views
0

何らかの理由でアンドロイドOSが自分のasynctaskを遅延または中断する可能性がありますか?もしそうなら、私の仕事(例えば、データベースからデータを取り出す)が遅れたり中断されないようにするには、何ができるでしょうか。おそらくUIスレッド上で実行しますが、UIをフリーズさせて遅延を引き起こす可能性があるので、それは良い考えではないことを読んでいます。アンドロイドは私の非同期タスクを遅らせたり中断したりできますか?

+0

どのような状況で、タスクを遅延または中断しますか? – Victory

+0

私はデータベースからデータを取り出して、リストビューを作成しています。非同期タスクが完了したら、非同期タスクを使用してデータをフェッチし、arraylistに格納します。onPostExecute()関数のnotifyDataSetChanged()を呼び出して、リストビューアダプタを更新します。ほとんどの場合、リストはうまくロードされますが、いつかは遅延があります(空白の画面が表示されます)、しばらくしてからリストビューが更新されます。 –

+1

データベースからフェッチするのに時間がかかっただけでなく、期待されていることをどのように確信していますか?ディスクioは遅くなる可能性があります。 – Victory

答えて

2

それは、Android OSが何らかの理由で私のasynctaskを遅らせたり中断する可能性があります。

AsyncTaskの別のインスタンスによってブロックされている可能性があります。デフォルトでは、彼らは、単一のバックグラウンドスレッドで実行します。https://developer.android.com/reference/android/os/AsyncTask.html

ので、私は私の仕事は、(例えば、データベースからデータをフェッチする)ことを保証するために何ができるかが遅れたり、中断されていない場合。

正確に遅延を引き起こす原因を調査します。それはdoInBackgroundメソッドの中にあるのでしょうか、あるいはバックグラウンド操作の前後に遅延が起こるかもしれません。コードをデバッグすることなく伝えるのは難しいことです。

UIスレッドで実行している可能性がありますが、UIがフリーズして遅延が発生する可能性があるため、これはお勧めできません。

この場合、AsyncTaskは良い解決策ではありませんが、正しく実装するとうまくいくはずです。考慮する他の方法はLoaders、またはAsyncQueryHandlerContentProviderです。あなたのユースケースによって異なります。

+0

ないとして、これはUは完全に右ではありませんいくつかのケースではUIをブロックすることがあり、AsyncTaskは店にオペレーションを実行するためにthreadPoolExecutorを使用し、シンプルなLinkedBlockingQueue (2 * C + 1)のスレッドの名前は「AsyncTask#」で指定され、AsyncTaskが完了した後ではなく、次のタスクまで待機します。 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L208 – Inverce

+0

ありがとうございます。あなたのリンクによれば、次の行があります:private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; 。 'AsyncTask' *はthreadPoolExecutorを使うことができますが、デフォルトの動作はserialです。 –

+0

@Inverce 'HONEYCOMBで始まって、並列実行によって引き起こされる共通のアプリケーションエラーを避けるために、タスクは単一のスレッド上で実行されます。 '[こちら](https://developer.android.com/reference/android/os/AsyncTask.html )。 – Enzokie

0

@Override protected void onPreExecute(){ holdWait = false; stop = false; }

@Override 
    protected Void doInBackground(Void... params) { 
     synchronized (this) { 
      while(true) { 
       if(Work) return null; 
       if(HaveWork) { 
        //make some 
       } else { 
        try { 
         wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
     return null; 
    } 

    public void mynotify() { 
     synchronized (this) { 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 

    public void setStopWork() { 
     synchronized (this) { 
      stop= false; 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 
} 
+0

あなたは私の質問を理解できなかったと思います。私はasynctaskへの参照を保持しておらず、再度実行しagaingしています。私はちょうど私のアプリが起動時に一度だけデータベースからデータをフェッチするasyctaskを実行します。私は –

+0

@DayemSiddiquiはこれがあなたに – user1782565

+0

@DayemSiddiquiを確認してくださいコードを更新した – user1782565

関連する問題