我想尝试装载机。但是当我在文档中调用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
}
答案 0 :(得分:6)
但是当我在文档中调用initLoader()时,UI-Thread会被onCreateLoader中的代码阻止。
正如Luksprog所说,onCreateLoader()
在调用initLoader()
的同一个线程上调用,通常这是主应用程序线程。 onCreateLoader()
创建Loader
的工作,正如您可能已经猜到的那样。
不是装载机的全部意义吗?
Loader
的要点是加载数据。 AsyncTaskLoader
的要点是异步加载数据。我们欢迎您创建一些不从Loader
继承的其他AsyncTaskLoader
,在这种情况下,异步加载是您的作业。
我应该怎么做以防止UI-Thread在这里被阻止?
编写onCreateLoader()
的正确实现,创建Loader
实例并返回它,而不是循环100000000次,然后返回null
。