2016-03-28 12 views
1

アンドロイドにはスレッドを実行するAsyncTaskがあり、ポスト実行時にこのメソッドを使用してメインスレッドと再び対話できます。 javaにこれと同等のものがありますか?別のスレッド(doInBackground)でタイマーを実行しようとしています。時間が終了すると、メインシアードとやり取りしてサービスを再開できます(onPostExecuteはサービスを再開します)。asyncTask in java

+0

ExecutorService、ScheduledExecutorService、Timerを意味しますか? –

+0

AsyncTaskだけ使用できます。 Androidはオープンソースを覚えています。 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/os/AsyncTask.java#AsyncTask –

+0

@ Jdavis649「Oracleチュートリアル」を参照してください。 Executors](http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html)を参照してください。 –

答えて

1

私はAndroidデベロッパーではありませんしかし、私はそれが簡単にJavaの8にCompletableFutureを使用することによって実現することができると思います:

import java.lang.reflect.InvocationTargetException; 
import java.util.concurrent.CompletableFuture; 
import javax.swing.SwingUtilities; 

public abstract class AsyncTask <Params, Progress, Result> { 
    protected AsyncTask() { 
    } 

    protected abstract void onPreExecute(); 

    protected abstract Result doInBackground(Params... params) ; 

    protected abstract void onProgressUpdate(Progress... progress) ; 

    protected abstract void onPostExecute(Result result) ; 

    final void publishProgress(Progress... values) { 
     SwingUtilities.invokeLater(() -> this.onProgressUpdate(values)); 
    } 

    final AsyncTask<Params, Progress, Result> execute(Params... params) { 
     // Invoke pre execute 
     try { 
      SwingUtilities.invokeAndWait(this::onPreExecute); 
     } catch (InvocationTargetException|InterruptedException e){ 
      e.printStackTrace(); 
     } 

     // Invoke doInBackground 
     CompletableFuture<Result> cf = CompletableFuture.supplyAsync(() -> doInBackground(params)); 

     // Invoke post execute 
     cf.thenAccept(this::onPostExecute); 
     return this; 
    } 
} 
+0

私は専門家ではありませんが、[Executors framework](http:// docs .oracle.com/javase/tutorial/essential/concurrency/executors.html)が既にJavaに組み込まれています。 –

+0

私の目的は、Java 8のSwingsライブラリで動作するAsyncTaskと似た機能を持つクラスを与えることです。別のメソッドexecute(Params ... params、Executor executor)を定義できるので、間違いなくExecutorsフレームワークの一部として使用できます)。さらに、onPostExecuteと同様のコールバック/継続メカニズムは、Executorsフレームワークではサポートされていません。 –

+0

@ TuanDo、代わりに単にSwingWorkerを使用してみませんか? –

0

あなた要するに

に合わせたソリューションは、java: run a function after a specific number of secondsを見てください。

あなたの目的のために、AsyncTaskは必要ありません。 AsyncTaskは、時間が必要なものを実行するためのものですが、そうしない方がいいでしょう(複雑な計算やインターネットからのデータの取得など)。それはあなたが待たなければならない問題を回避するためのものです。
代わりにやりたいことは、遅延を導入することです。あるいは、より正確には、遅れた後に何らかのアクションが発生するようにスケジュールする必要があります。 AsyncTaskのようなクラスを使用することもできますが、残念ですが、より複雑なコードになります。 AsyncTaskは、UIのコンセプト(UI =に接続されていることを、標準的なJava

ノートにAsyncTask

new java.util.Timer().schedule(
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       // your code here 
      } 
     }, 
     5000 
); 

等価:あなたは代わりにTimerTimerTaskで遅延実行のために調整されたクラスを、使用する必要がありますUIスレッドからのみ開始されるため)。一般的に非同期的に何かを実行するのではありません。

したがって、アンドロイドのAsyncTaskと最もよく一致するのは、JavaではSwingWorkerです。 SwingはJavaの標準UIフレームワークです。 UIスレッドを持つAndroidと同様の概念を持っています。 Swingでは、このスレッドはイベントディスパッチスレッドと呼ばれます。したがって、SwingWorkerのデザインもAsyncTaskと非常に似ています。 doInBackground()メソッドであっても、両方のクラスで同じ名前を持ちます。一般

非同期実行

あなたの条件は、UIに関連して、あなたはそれが非同期に実行させていくつかの時間のかかる操作を調達したいされていない場合は、実行プログラムを見てする必要があります。さまざまな目的のためにエグゼキュータを使用するさまざまな方法がありますので、これはこの回答の範囲を超えています。詳しい情報に関心がある場合は、Jakob Jenkov's tutorial on ExecutorServiceから始めてください。