2017-03-17 10 views
2

私は、IBM WorkManager (v8.0.0)と協力して、メインスレッドと非同期の仕事をしています。私は、次のコードを使用します。このため 例外を指定してWorkEventを完了したときにmainthreadに通知する方法は?

は:

// wm = via resource injected WorkManager 

WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener() { 

    @Override 
    public void workStarted(WorkEvent arg0) { 
    } 

    @Override 
    public void workRejected(WorkEvent arg0) { 
    } 

    @Override 
    public void workCompleted(WorkEvent arg0) { 
    WorkException exception = arg0.getException(); 
    if (null != exception) { 
     throw new RuntimeException("WorkCompleted with Exception"); 
    } 
    } 

    @Override 
    public void workAccepted(WorkEvent arg0) { 
    } 
}); 

これは、例外なく、非常に細かな限りWorkEventが完成した作品。しかし、例外を除いて完了したときに、私はメインスレッドに通知して、より多くのWorkItemをWorkManagerに提出しないようにしたいと思っています。

私はmainthreadを通知するRunetimeExceptionを上げることができると思ったが、私は例外がmainthreadsがWorkManagerにすべてWorkItemsを提出し、WorkManagerjoin -methodを呼び出して終了し、その瞬間にスローされることが判明したログを分析 - これはあまりにも遅い(ほとんどの場合、WorkManagerによって50,000アイテムが処理されなければならない)。

workCompletedに例外が認識された今、私はこの瞬間に多くのアイテムをWorkManagerに提出するのを止めるために私のメインスレッドを中断できますか?

+0

最終的にうまくいったのはうれしい! – GhostCat

答えて

1

"より直接的な"インターフェースが必要です。

意味;

WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener() 

この命令を含むクラスには、いくつかの「入力」チャネルが必要です。例えば、あなたの仕事項目がを加えたそのクラスList<Exception>に "単純な"フィールドがあるかもしれません。

これらの作業項目を作成する "メイン"クラスは、その一覧を定期的にチェックする必要があります。例外が見つかった場合は単に新しい作業項目の追加を停止してください。

もちろん、そのスレッドを安全にし、合理的なアーキテクチャを提供する必要があります。

+0

ありがとうございます。私はそのような "橋"を実装し、後でそれをテストします。 – bish

関連する問題