繁体   English   中英

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

[英]Access variable on one thread from another thread - Android

嗨,我已创建和活动。 让我们假设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);

    }


}

}

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

把你的光标声明放在onCreate()之外

你可以把它:

     public Cursor myCursor;

这样您就可以访问它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM