私は少しジレンマに苦しんでいます。皆さんが私を助けてくれることを願っています。AsyncTaskにWeakReference <Context>またはApplication Contextを使用する必要がありますか?
ご覧のとおり、ギャラリーに.jpgファイルとしてBitmap
オブジェクトを保存するコードがあるAsyncTask
があります。 AsyncTask
私はContext
も使用していますが、この内部クラスのActivity
のコンテキストを使用するとメモリリークが発生する可能性があるので、WeakReference<Context> weakContext;
に変更してガベージコレクタで収集できます。
しかし、私は、コンストラクタから渡されたView
から取得Application
コンテキストを使用することによって、私は弱いコンテキストの参照として
を同じ効果をアーカイブする必要があるので、この場合には他よりも使用するように任意の良いですか?
public class ViewToBitmap {
private View view;
private WeakReference<Context> weakContext;
public ViewToBitmap(@NonNull View view) {
this.view = view;
}
// This?
private WeakReference<Context> getContext() {
weakContext = new WeakReference<>(view.getContext());
return weakContext;
}
// Or This?
private Context getContext() {
return view.getContext().getApplicationContext();
}
private class AsyncSaveBitmap
extends AsyncTask<Void, Void, Void>
implements MediaScannerConnection.OnScanCompletedListener {
@Override
protected Void doInBackground(Void... params) {
//TODO: Save bitmaps to gallery
//CONTEXT IS USED HERE
getContext().get()
return null;
}
}
私はあなたの提案を調べます。しかし、AsyncTaskクラスのインタフェースを介してContextを渡すのはどうでしょうか?それを静的にして、必要なすべての変数をコンストラクタ経由で渡しますか? – Muddz
このコードは実際にはライブラリの一部なので、ユーザーがonStop()で余分なコードを手作業で書かなくても構わないようにしてください。私が実際にコンテキストを使用する唯一の場所は 'MediaScannerConnection.scanFile(context、new String [] {file.toString()}、null、this);'保存されたビットマップをスキャンするための行です。 – Muddz
@Muddz、 「コンテキスト」を必要とする場合、有効なアプローチはアプリケーションのコンテキストを使用することです。これは、 'getApplicationContext()'を呼び出すことによって他の 'Context'から取得できます。アプリケーションのコンテキストはシングルトンとして扱うことができるため、メモリリークのリスクなしにローカル変数に格納することができます。しかし、このアプローチは最後の手段としてのみ使用すべきである。 – Vasiliy