你好,我创建了一个Activity,假设它是BaseActivity。我在该Activity中创建了一个新线程。
事实上,我已经阅读过并知道,一旦Activity被销毁在onConfigurationChange或其他情况下,线程将不会被垃圾回收,从而导致内存泄漏。
有两个规则可以解决这个问题。
一个是将Thread类设置为静态的,另一个是在onDestroy中显式停止线程。我都实现了。
我创建这个线程来查询内容提供程序。所以我设法将应用程序上下文传递到线程中并开始使用它。但不幸的是,我不能像“Cursor myCursor;”这样使用我在OnCreate中声明的游标。我尝试将返回的游标分配给myCursor。它要求我创建一个局部变量。我认为这是Activity Context的问题。
我认为我获得了应用程序上下文,“我获得了整个应用程序上下文”。但不幸的是不是这样。我甚至搜索并发现我应该获取外部类的弱引用。我清楚地理解了关于WeakReference,但不幸的是,对于我的情况,我不知道如何获得外部类的弱引用。请帮帮我。
我甚至尝试将activity 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);
}
}
}