onCreateLoader阻止了UI线程

时间:2014-05-04 15:00:07

标签: android multithreading loader

我想尝试装载机。但是当我在文档中调用initLoader()时,UI-Thread将被onCreateLoader中的代码阻止。这不是装载机的全部意义吗? 为什么会这样,我该怎么做才能阻止UI-Thread在这里被阻止? 我在Nexus 5上使用Android Studio中的调试。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_content_provider_test);
    getLoaderManager().initLoader(0, null, this);
}

@Override
public Loader onCreateLoader(int loaderID, Bundle args) {
    //Do nothing 100000000 times
    for(int i=0; i< 100000000; i++)
        ;
    return null;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    //nothing to display
}

@Override
public void onLoaderReset(Loader loader) {
    //nothing to reset
}

1 个答案:

答案 0 :(得分:6)

  

但是当我在文档中调用initLoader()时,UI-Thread会被onCreateLoader中的代码阻止。

正如Luksprog所说,onCreateLoader()在调用initLoader()的同一个线程上调用,通常这是主应用程序线程。 onCreateLoader()创建Loader的工作,正如您可能已经猜到的那样。

  

不是装载机的全部意义吗?

Loader的要点是加载数据。 AsyncTaskLoader的要点是异步加载数据。我们欢迎您创建一些不从Loader继承的其他AsyncTaskLoader,在这种情况下,异步加载是您的作业。

  

我应该怎么做以防止UI-Thread在这里被阻止?

编写onCreateLoader()的正确实现,创建Loader实例并返回它,而不是循环100000000次,然后返回null

the documentation on the Loader framework中介绍了这一点。