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

4

你好,我创建了一个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);

    }


}

}


2
请发布您的代码。 - Howard Pautz
一个对象/类的公共变量可以从所有其他对象访问,无论线程如何。 - Cruncher
@HowardPautz 这是我的代码。我也是初学者。 - Raaja SN
1个回答

0

你无法访问它,因为你在方法中声明了它的局部变量。

将光标的声明放在onCreate()之外。

你可以这样放置:

     public Cursor myCursor;

这样你就能够访问它了。


那么对于每个视图,我需要更新,我需要在作用域中声明它们吗?如果我声明它,它会要求我创建一个静态变量。这样可以吗? - Raaja SN
有没有其他方法在创建线程时传递活动的上下文,例如MyThread(Myactivity.this)? - Raaja SN
谢谢,我明白了。现在我已经在另一个线程中设置了查询。同时,我正在使用游标从内容URI中提取数据。都是在新线程上完成的。我将所有这些数据放在了两个列表视图中。我可以使用Handler和Bundle传递这些列表视图吗?哪种方法更好? - Raaja SN
@JanBo 实际上我已经这样做了。我声明了列表和适配器的变量为静态范围。现在我能够从手动线程更新列表到UI线程。这样好吗?我已经更新了我的代码并发布在http://stackoverflow.com/questions/18673553/listview-updates-only-when-activity-restarts-android - Raaja SN
你的代码中没有看到任何处理程序?另外,不要在onStart方法中启动线程,在设置适配器和其他所有内容后,在onCreate方法中启动它。此外,在onStop方法中使用albumThread = null;并不能停止你的线程。 - JanBo
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接