4

こんにちは、アクティビティを作成しました。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);

    }


}

}

4

1 に答える 1

0

メソッドでローカルに宣言したため、アクセスできません。

カーソルの宣言を onCreate() の外に置きます

あなたはそれを置くことができます:

     public Cursor myCursor;

この方法でアクセスできるようになります。

于 2013-09-06T17:47:51.957 に答える