Альтернатива методу 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 заставляет пользовательский интерфейс замирать и, как таковой, не подходит для этого. Какие еще существуют варианты?

Ответы

Ответ 1

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

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

Ответ 2

Начать операцию в

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();
    }
}

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

Ответ 3

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