こんにちは、アクティビティを作成しました。BaseActivity と仮定します。その活動に新しいスレッドを作成しました。
実際、onConfigurationChangeまたはその他でアクティビティが破棄され、メモリがリークされると、スレッドがガベージコレクションされないことを読んで知りました。
これを修正するための 2 つのルールがあります。
1 つは Thread クラスを Static にする方法で、もう 1 つは onDestroy で明示的にスレッドを停止する方法です。私は両方をやりました。
このスレッドを作成して、コンテンツ プロバイダーにクエリを送信しました。だから私はなんとかapplicationContextをスレッドに入れ、それを使い始めました。しかし残念ながら、「Cursor myCursor;」のように OnCreate で宣言した Cursor は使用できません。. 返されたカーソルをこの myCursor に割り当ててみました。ローカル変数を作成するように求められます。これはActivity Contextの問題だと思います。
アプリケーションコンテキストを取得したとき、「アプリケーション全体のコンテキストを取得した」と思いました。しかし、残念ながらそうではありません。私も検索して、外側のクラスへの WeakReference を取得する必要があることを知りました。WekaReference について明確に理解しましたが、残念ながら私の状況では、外部クラスの弱い参照を取得する方法がわかりません。助けてください。
アクティビティ Context を MyThread(BaseActivity.this) のようなスレッド コンストラクターに渡そうとしましたが、これをスレッド内で使用する方法がわかりません。
public class MediaActivity extends Activity {
ExpandableListView expList ;
ExpandableListAdapter expListAdapter;
List<String> albumHead;
HashMap<String, List<String>> albumChild;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media);
ExpandableListView expList = (ExpandableListView)findViewById(R.id.mediaList);
Cursor albumCursor;
AlbumThread albumThread = new AlbumThread();
albumThread.start();
}
private static class AlbumThread extends Thread{
Context appContext = MediaApp.getAppContext();
Context mediaActivity;
public AlbumThread() {
super("AlbumThread");
}
@Override
public void run() {
// Query Media Contents from MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
super.run();
ContentResolver albumResolver = appContext.getContentResolver();
Uri mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] mediaColumns = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME,
};
String mediaSort = "ORDER BY" + MediaStore.Audio.Media.ALBUM_ID + "ASC" + "," + MediaStore.Audio.Media.DISPLAY_NAME + "ASC";
albumCursor = albumResolver.query(mediaContentUri, mediaColumns, null, null, mediaSort);
}
}
}