Альтернатива методу Thread.sleep в Android

У меня есть эта кнопка, которая при нажатии сохраняет детали, введенные в моих текстовых полях, в Google App Engine, сразу после вызова этого onClickListener, у меня есть намерение, которое запускает новое действие, которое отображает только что введенные мной данные. Вот код для этого:

submitButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(v.getId() == R.id.userDetailsCaptureButton) {
                new EndpointsTask().execute(getApplicationContext());
            }

            startActivity(userProfileDisplayIntent);
        }
    });

Теперь я хочу подождать пару секунд, прежде чем позвонить startActivity после new EnpointsTask().execute(getApplicationContext) был вызван. Я прочитал это, используя Thread.sleep вызывает зависание пользовательского интерфейса и поэтому не подходит для этого. Какие еще есть варианты?

3 ответа

Решение

Решение состоит в том, чтобы использовать обработчик с работоспособным и использовать метод postDelayed. Пример:

new Handler().postDelayed(new Runnable() {
    public void run () {
        // Do delayed stuff!
    }
}, 5000L); //5 seconds delay 

Начать деятельность в

onPostExecute()

из

EndpointsTask

Ваша задача EndPoints должна выглядеть так

public final class EndpointsTask extends AsyncTask {

    private final Intent mUserProfileDisplayIntent;
    private final WeakReference<Activity> mActivityReference;

    EndpointsTask(final Activity activity, final Intent userProfileDisplayIntent) {
        mActivityReference = new WeakReference<Activity>(activity);
        mUserProfileDisplayIntent = userProfileDisplayIntent;
    }

    @Override
    protected void onPostExecute(Void result) {
        final Activity activity = mActivityReference.get();
        if (activity != null) {
            startActivity(mUserProfileDisplayIntent);
        }
    }
}

А потом

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.userDetailsCaptureButton) {
            // make sure only one task can be launched
            if (endPointsTask == null || endPointsTask.getStatus() != AsyncTask.Status.RUNNING) {
                 endPointsTask = new EndpointsTask(YourActivity.this);
                 endPointsTask.execute();
            }
        }
        startActivity(userProfileDisplayIntent);
    }

// always cancel AsyncTasks in onStop(). You don't want it to launch anything when minimized, do you?

@Override
protected void onStop() {
    super.onStop();
    if (endPointsTask != null && endPointsTask.getStatus() == AsyncTask.Status.RUNNING) {
        endPointsTask.cancel();
    }
}

Не передавайте Контекст в качестве параметра любому потоку, так как это может вызвать утечку. Это также означает, что внутренние классы должны быть статическими. Сохранение контекста как WeakReference (используйте mActivityReference для Context в текущем примере)

Попробуйте это с помощью Handler и postDelayed-метода внутри onClick

Другие вопросы по тегам