代码之家  ›  专栏  ›  技术社区  ›  Raaja SN

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

  •  4
  • Raaja SN  · 技术社区  · 12 年前

    嗨,我已经创建了和活动。让我们假设BaseActivity。我在那个活动中创建了一个新的线程。

    事实上,我已经阅读并了解到,一旦在onConfigurationChange或其他平台上销毁活动,并且内存泄漏,线程就不会被垃圾收集。

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

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

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

    当我得到应用程序上下文时,我想“我得到了整个应用程序上下文”。但不幸的是没有。我甚至搜索了一下,发现我应该得到一个外部类的WeakReference。我清楚地理解WekaReference,但不幸的是,就我的情况而言,我不知道如何获得外部课程的弱参考。kindle帮帮我。

    我甚至尝试将活动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);
    
        }
    
    
    }
    

    }

    1 回复  |  直到 12 年前
        1
  •  0
  •   JanBo    12 年前

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

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

    你可以这样说:

         public Cursor myCursor;
    

    通过这种方式,您将能够访问它。