2016-08-17 3 views
1

私は、いくつかのバックグラウンド操作を実行する別のクラス(すべての計算ロジックがある)のメソッドを呼び出すAsyncTaskを持っています。私は操作のステータス/進行状況を表示したい。私は、にpublishProgress()と呼んで、進行状況をUIスレッドに公開できることを知っています。しかし、ロジックが別のクラスにあるので、AsyncTaskのインスタンスを渡してそこからpublishProgress()を呼び出す必要があります。進捗を公開するために、別のクラスのメソッドにAsyncTaskインスタンスを渡すのがよいですか?

これは適切な方法ですか? ランタイム問題またはメモリリーク

誰かがこれを済ませている場合は、適切な方法でこれを達成するように案内してください。

EDIT1:AsyncTaskで私はSOAP Webサービス

+1

使用_interface_ – Piyush

+0

@PiyushGupta:メモリリークの原因になりますか?姿勢が変更されるシナリオを考慮します。 –

+0

@Rithe:私はすでにそれを使用しています。これはコールバックメソッドです。しかし、 'doInBackground()'で 'publishProgress(someValue)'を呼び出してそれをトリガーする必要があります。 –

答えて

0

を呼び出していますすべてでAsyncTaskを使用するのは良い考えではありません - それは時代遅れです。代わりにrxJavaライブラリを使用する

+1

なぜあなたはそれが時代遅れだと言いますか? –

+0

Beacause(AsyncTask)は、バックグラウンドスレッド(スレッドプールも提供する必要があります)でのみ動作し、メインスレッドで結果を処理できます。 rxJavaでは、あるスレッドでデータを作成し、別のスレッド(通常はSchedulers.io()とSchedulers()の計算)で処理できますが、HandlerThreadからカスタムスケジューラを作成して、別のスレッドで結果を処理できます。 Retrofit2はrxJavaをサポートしているので、REST API –

+1

を使用すると非常に便利です。私はあなたに同意します。実際、AsyncTaskではなく、自分のプロジェクトでRetrofit + RxJavaを使用しています。 Retrofit + RxJavaはより優れたソリューションですが、AsyncTaskが廃止された理由ではありません。このスタック(Retrofit + RxJava)を使用すると、プロジェクトへの依存度が増し、場合によっては単純化のためにAsyncTaskを使用する方が効果的です。 –

-1

あなたの質問で分かっているように、doInBackgroundから呼び出すメソッドがあります。そのメソッドのスコープの外側に何かが保存されていれば(メンバまたはスタティックメンバ、またはスタティックメンバのメンバなどです。 )、実行自体がAsyncTaskとそこから参照されているコンテキストをリークしないと言うのは理にかなっています。しかし、それ以上に、上記の場合でも、このAsyncTaskが漏れる多くの方法があります。

+0

代替手段はありますか? –

+0

IntentServiceとEventBusの併用 –

+0

AsyncTaskでEventBusを使用できませんか?はいの場合、2つのアプローチの違いは何ですか?効率的でメモリリークの発生が少ないのはどれですか? –

関連する問題