我正在查看ListActivity
源代码,我看到正在定义私有Handler
,并且Runnable
已发布到onContentChanged()
中的mList.focusableViewAvailable()
{1}}方法。
我不太了解这一点,因为我理解的处理程序是用于线程间通信的。这里,处理程序和发布的定义发生在同一个线程上,并且在post()调用中没有指定延迟。我无法看到处理程序被用于其他任何东西。
我可能在这里误解了处理程序的使用。为什么它按照它的方式完成,而不是直接运行ListActivity
(runnable中的调用)?结果不一样吗?
Beneath是我认为是public class ListActivity extends Activity {
protected ListView mList;
private Handler mHandler = new Handler();
private Runnable mRequestFocus = new Runnable() {
public void run() {
mList.focusableViewAvailable(mList);
}
};
/**
* Updates the screen state (current list and other views) when the
* content changes.
*
* @see Activity#onContentChanged()
*/
@Override
public void onContentChanged() {
super.onContentChanged();
View emptyView = findViewById(com.android.internal.R.id.empty);
mList = (ListView)findViewById(com.android.internal.R.id.list);
if (mList == null) {
throw new RuntimeException(
"Your content must have a ListView whose id attribute is " +
"'android.R.id.list'");
}
if (emptyView != null) {
mList.setEmptyView(emptyView);
}
mList.setOnItemClickListener(mOnClickListener);
if (mFinishedStart) {
setListAdapter(mAdapter);
}
mHandler.post(mRequestFocus);
mFinishedStart = true;
}
}
源代码的相关部分:
{{1}}
答案 0 :(得分:2)
为什么它按照它的方式完成,而不是直接运行mList.focusableViewAvailable()(runnable中的调用)?结果不一样吗?
您的担忧不应该是Handler
。您应该关注post()
。由于Handler
上post()
可用,因此甚至不需要View
- 但此代码可能会在此之前提供。
post()
接受Runnable
并将其放在主应用程序线程的消息队列中。因此,在目前该队列上的所有其他消息得到处理(FIFO)之前,它不会被处理。据推测,ListActivity
需要在focusableViewAvailable()
成功运行之前首先处理队列中的其他一些消息。