Понимание обработчика в ListActivity - PullRequest
1 голос
/ 12 февраля 2011

Я смотрю на исходный код ListActivity и вижу, что определяется приватный Handler и что Runnable отправляется этому обработчику в методе onContentChanged().

Я не совсем понимаю в этом суть, поскольку обработчики, насколько я понимаю, существуют для связи между потоками. Здесь определение обработчика и публикации происходит в одном потоке, и в вызове post () не указывается задержка. Я также не вижу, чтобы этот обработчик использовался для чего-либо еще.

Я, наверное, что-то неправильно понял об использовании обработчиков здесь. Почему это делается так, как здесь, а не просто с помощью прямого запуска mList.focusableViewAvailable() (вызов внутри исполняемого файла)? Разве результат не будет таким же?

Ниже, на мой взгляд, приведены соответствующие части исходного кода ListActivity:

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 Ответ

2 голосов
/ 12 февраля 2011

Почему это делается именно так, как здесь, а не просто запуском mList.focusableViewAvailable () (вызов внутри runnable) напрямую?Разве результат не будет таким же?

Ваша забота не должна быть Handler.Ваша проблема должна заключаться в звонке на post().Handler даже не требуется, так как post() доступен на View - этот код может предшествовать этому, хотя.

post() берет Runnable и помещает его вочередь сообщений для основного потока приложения.Таким образом, он не будет обработан до тех пор, пока не будут обработаны все другие сообщения, которые в данный момент находятся в этой очереди (FIFO).Предположительно, ListActivity необходимо обработать какое-то другое сообщение в очереди, прежде чем focusableViewAvailable() будет успешно работать.

...