2014-01-07 104 views
-1

我重构我的线程,以避免内存泄漏,我得到了有关处理程序和startActivityForResult 2个误差从线程中被调用(处理Google云端硬盘)Android的 - 不能让一个静态引用非静态方法

我有我的DownloadActivity:

公共类DownloadActivity延伸活动{ .... 私人无效getFolderId(){ getFolderIdThread =新getFolderIdThread(); getFolderIdThread.start(); }

private static class GetFolderIdThread extends Thread { 
    private Boolean mRunning = false; 

    @Override 
    public void run() { 
     mRunning = true; 

        fResultList = new ArrayList<File>(); 
      Files f1 = mService.files(); 
      Files.List request = null; 
      aFolderId = null; 
      do { 
       try { 
        request = f1.list(); 
        String aQuery = "'root' in parents and mimeType='application/vnd.google-apps.folder' and title='"+ aFolderName + "'"; 
        request.setQ(aQuery);      
        FileList fileList = request.execute(); 
        fResultList.addAll(fileList.getItems()); 
        request.setPageToken(fileList.getNextPageToken()); 
       } catch (UserRecoverableAuthIOException e) { 
        startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); <= THIS RAISES THE ERROR 
       } catch (IOException e) { 
        e.printStackTrace(); 
        if (request != null){ 
         request.setPageToken(null); 
        } 
       } 
      } while (request.getPageToken() !=null && request.getPageToken().length() > 0); 

      if (fResultList.size() == 0) { 
       Log.d(TAG, "cannot find the training folder at root level"); 
       Message msg = handler.obtainMessage(); <= THIS RAISES THE ERROR 
        Bundle bundle = new Bundle(); 
        bundle.putInt("msgKey", DownloadActivity.NO_TRAININGS_FOLDER); 
          msg.setData(bundle); 
          handler.sendMessage(msg); <= THIS RAISES THE ERROR 
      } else { 
       File folder = fResultList.get(0); 
       aFolderId = folder.getId(); 
       getFolderContents(); <= THIS RAISES THE ERROR 
     } 
    } 
    public void close() { 
     mRunning = false; 
    } 
} 

我已经在我的活动

Handler handler = new Handler() { 
     @Override 
    public void handleMessage(Message msg) { 
     ... 
     } 
    } 

和onActivityResult定义的处理程序

protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    switch (requestCode) { 
     case REQUEST_ACCOUNT_PICKER: 
        .... 
        break; 
      } 
    } 

我有哪些选择绕过这个错误?

回答

1

GetFolderIdThread类是静态的,并且静态嵌套类不能在创建它的外部类的实例中引用非静态方法和字段。这样的嵌套类只能访问Activity中的静态方法和字段。从类定义中删除静态,我认为你的问题将解决。

您还需要将您的调用发布到UI线程上的startActivityForResult。当然,你应该能够使用您的处理程序是,是这样的:

handler.post(new Runnable() 
{ 
    public void run() 
    { 
     startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); 
    } 
}); 

确保当你这样做,因为这将继续运行你的线程可以正常完成为好。

+0

我试图写我的线程为静态,以避免任何显式引用封闭类,所以活动实例不会泄漏时,配置更改...我在我的onDestroy()方法中添加一个thread.close() (Activity class)...我需要再读一些关于Runnable类的文档...以更好地理解如何泄漏 – erwin

+0

找到了一个非常好的帖子,如何安全地处理我的线程和避免memoty泄漏.. http: //www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html – erwin

相关问题