2017-02-03 5 views
0

長期実行タスクを持つアプリケーションがあります。タスクオブジェクトは安全にApplicationオブジェクトに移動されます。しかし、まだ、私はUIを更新する必要があります。これまでのところ、タスクは実際には長時間実行されているため、ユーザーは別のアクティビティに移動でき、現在のアクティビティは破棄される可能性がありますが、タスクは引き続き機能します。 これで、タスクが完了した後、アクティビティのUIを変更したいと思います。しかし、これは活動の新しい例かもしれないし、活動が破壊されるかもしれない。しかし、もしそれが生きていれば(どのインスタンスに関係なく)私はこの変更をしたい。これは私が必要なものを擬似コードです:名前でアクティビティインスタンスを取得する(実行中の場合)

MyActivity act = SomeActivityManager.get(MyActivity.class.name()); 
if(act == null) { 
// the activity is destroyed, no action needed, 
// on next creating all UI changes will be in place 
} else { 
    act.drawRedLine(); // custom method of my activity 
} 

そして、私は(まだ私はApplicationオブジェクト内のすべての活動にWeakHashMapで行くことができますが、これは間違いなく、潜在的な問題と汚い方法です)アンドロイド-SDKベースのソリューションを好みます。

+0

長時間実行されているタスクをサービス内でホストしていないのはなぜですか? – Enzokie

+0

アクティビティの更新については、その参照が必要です。システムがアクティビティを再作成し、参照が無効になる可能性があるため、参照を保持できません。また、メモリリークが発生します。だから私は本当のアクティブな参照が必要です。それは約質問です。 – msangel

+0

アクティビティが現在表示されていない場合は、レンダリングを停止する必要があります(現在のアクティビティがアニメーション化されている場合は非常に最悪の場合があります)。状態や数学的な論理/計算をホストすることは簡単ですが、最後にはホストからの最後の値をonStart()の間に再レンダリングすることができます。その時点でActivity参照を取得できます。 – Enzokie

答えて

0

それが最善の方法ですが、あなたは

LocalBroadcastManager.getInstance(context).sendIntent(new Intent("DrawRedLine"));

のようなものを使用して長時間実行タスクによって送信されたテントを使用してこのようなBroadcastReceiverであなたの活動でそれを受け取ることができるかどうかわかりません:

BroadcastReceiver br = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //update your activity 
    } 
}; 
LocalBroadcastManager.getInstance(this).registerReceiver(br, new IntentFilter("DrawRedLine")); 

onCreateでこのようにそれを登録し、

onDestroyでそれを登録解除
+0

技術的には、WeakHashMapを持つバリアントにかなり近いですが、より安全です。何らかのアクティビティマネージャーでまだ興味深いケース。私のインテントフィルタはすべてグローバル変数のように見えるので、この変種は少し悪い面があります。だから私は命名して、これらのフィルタを制御下に置くことに注意する必要があります。私のアプリケーションには、このような操作と呼び出しがたくさんあります。 – msangel

関連する問題