gpt4 book ai didi

java - 从另一个线程访问一个线程上的变量 - Android

转载 作者:搜寻专家 更新时间:2023-11-01 03:53:10 25 4
gpt4 key购买 nike

您好,我已经创建了 Activity。让我们假设 BaseActivity。我在该 Activity 中创建了一个新线程。

实际上,我已经阅读并了解到,一旦在 onConfigurationChange 或其他一些 Activity 上被销毁并且内存泄漏,线程就不会被垃圾回收。

有 2 条规则可以解决这个问题。

一种是将 Thread 类设为 Static,另一种是在 onDestroy 中显式停止线程。我都做了。

我创建了这个线程来查询内容提供者。所以我设法将 applicationContext 放入 Thread 并开始使用它。但不幸的是我不能使用我在 OnCreate 中声明的 Cursor,比如“Cursor myCursor;” .我尝试将返回的光标分配给这个 myCursor。它要求我创建一个局部变量。我认为这是 Activity 上下文的问题。

当我得到应用程序上下文时,我想,“我得到了整个应用程序上下文”。但不幸的是没有。我什至搜索并发现我应该得到一个外部类的 WeakReference。我清楚地了解 WekaReference 但不幸的是,对于我的情况,我不知道如何获得外部类的弱引用。点燃帮助我。

我什至尝试将 Activity 上下文传递给 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);

}


}

最佳答案

您无法访问它,因为您在您的方法中本地声明了它。

将你的游标声明放在 onCreate() 之外

你可以这样说:

     public Cursor myCursor;

这样您就可以访问它了。

关于java - 从另一个线程访问一个线程上的变量 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com