您好我已创建和活动。让我们假设BaseActivity。我在该活动中创建了一个新线程。
实际上我已经阅读并且知道一旦活动在onConfigurationChange上被破坏或其他一些内存被泄漏,线程就不会被垃圾收集。
有两条规则可以解决这个问题。
一个使Thread类成为静态类,另一个是在onDestroy中显式停止线程。我做了两件事。
我已经创建了这个线程来查询内容提供者。所以我设法将applicationContext带入Thread并开始使用它。但不幸的是我不能使用我在OnCreate中声明的Cursor,比如“Cursor myCursor”; 。我尝试将返回的光标分配给此myCursor。它要求我创建一个局部变量。我认为这是活动上下文的问题。
我认为当我获得应用程序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);
}
}
}
答案 0 :(得分:0)
您无法访问它,因为您在方法中在本地声明了它。
将你的光标声明放在onCreate()
之外 你可以说: public Cursor myCursor;
这样您就可以访问它了。