【问题标题】:Is onLoadFinished() asynchronous (background thread)?onLoadFinished() 是异步的(后台线程)吗?
【发布时间】:2013-08-20 03:02:52
【问题描述】:

我目前正在考虑使用加载器管理器在抽屉布局中填充我的可扩展列表视图。如果回调函数 onLoadFinished() 在 UI 线程或后台线程上运行,我在文档中找不到任何位置。它在后台线程上吗?

【问题讨论】:

    标签: android android-loadermanager


    【解决方案1】:

    如果你已经从 UI 线程调用了init(),那么onLoadFinished() 肯定会在 UI 线程上被调用。例如,当您从后台调用 AsyncTaskLoader 时,将收到有关结果通知的线程将是您初始化加载程序的线程。

    ...但是您仍然可以执行以下操作:

    @Override
        public void onLoadFinished(Loader<String> arg0, String arg1) {
            Runnable populate = new Runnable(){
    
                @Override
                public void run() {
                    //your code
                }
    
            };
            if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
                //on Ui thread
                populate.run();
            }else{
                this.runOnUiThread(populate); //or use handler to run the runnable
            }
    
        }
    

    :)

    【讨论】:

    • 当我添加检查以查看回调是否在 MainThread 中时,这似乎是我得到的。“初始化不在主线程中”,“在主线程中完成”。

      请注意,我从一个单独的线程中调用了加载程序。这是否意味着无论您如何调用 init loader,您的 onLoadFinished 都会在 UI 线程中调用?

    【解决方案2】:

    http://www.amazon.com/Android-Programming-Ranch-Guide-Guides/dp/0321804333,第。 566.

    “在后台加载数据后,将在主线程上调用 onFinishedLoad() 方法。”

    【讨论】:

      【解决方案3】:

      下面添加代码将解决onLoadFinished()中调用getView()返回NullPointerException的问题

      @Override
      public void onStop() {
          super.onStop();
          getSupportLoaderManager().destroyLoader(LOADER_ID);
      }
      

      【讨论】:

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