了解ListActivity中的处理程序

时间:2011-02-12 16:34:42

标签: android handler listactivity

我正在查看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}}

1 个答案:

答案 0 :(得分:2)

  

为什么它按照它的方式完成,而不是直接运行mList.focusableViewAvailable()(runnable中的调用)?结果不一样吗?

您的担忧不应该是Handler。您应该关注post()。由于Handlerpost()可用,因此甚至不需要View - 但此代码可能会在此之前提供。

post()接受Runnable并将其放在主应用程序线程的消息队列中。因此,在目前该队列上的所有其他消息得到处理(FIFO)之前,它不会被处理。据推测,ListActivity需要在focusableViewAvailable()成功运行之前首先处理队列中的其他一些消息。