【问题标题】:Android AsyncTask Starting Another AsyncTaskAndroid AsyncTask 启动另一个 AsyncTask
【发布时间】:2011-06-19 05:44:57
【问题描述】:

我目前正在 AsyncTask 的 onPostExecute 方法中执行类似的操作,其中NewTask 不是当前正在执行的任务:

private class OlderTask extends AsyncTask<String, Void, Integer> {
    //other functions (not important)

    @Override
    protected void onPostExecute(Integer result) {
        new NewTask().execute(null, null);
    }
}

我想知道这是不是一个坏主意。这样做会导致 OlderTask 的 GC 等待 NewTask 吗?使用这种方法是否还有其他可能的问题?

如果这是一个问题,我该如何解决?

【问题讨论】:

    标签: android garbage-collection android-asynctask


    【解决方案1】:

    除非NewTask 是OlderTask 中的内部非静态类,否则它不会阻止GC 收集OlderTask,除非您以其他方式存储对它的引用。

    但是即使 GC 会等到 NewTask 完成,这也没什么大不了的,除非您在 OlderTask 中保存大量数据或创建大量 OlderTask 的副本。

    因此,如果您的设计需要这样做,没关系。但是没有链式任务肯定更干净。

    【讨论】:

    • 谢谢。如果OlderTask 正在创建一个新的OlderTask,同样的逻辑是否也适用?
    • 只要它是 OlderTask 的不同实例并且它不直接或间接引用前一个实例。
    【解决方案2】:

    我使用回调方法,所以当 onPostExecute 结果出现时,我从 UI 调用另一个 AsynkTask,我认为这是个好主意,让我知道你的想法。

    public class PatientSearchController extends AsyncTask < String, Void, String > {
    
        private PatientSearchResultHandler handler = null;
    
        public void onResultHandler(PatientSearchResultHandler handler) {
            this.handler = handler;
        }
    
        @Override
        protected String doInBackground(String...params) {
    
        }
    
        @Override
        protected void onPostExecute(String result) {
            this.handler.onResultSuccessHandler(result);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多