Ответ 1
Решение заключается в использовании обработчика с runnable и использования метода postDelayed. Пример:
new Handler().postDelayed(new Runnable() {
public void run () {
// Do delayed stuff!
}
}, 5000L); //5 seconds delay
У меня есть эта кнопка, которая при нажатии сохраняет данные, введенные в мои текстовые поля в 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
заставляет пользовательский интерфейс замирать и, как таковой, не подходит для этого. Какие еще существуют варианты?
Решение заключается в использовании обработчика с runnable и использования метода 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();
}
}
Не передавать Контекст в качестве параметра ни одному потоку, поскольку он может вызвать утечки. Это также означает, что внутренние классы должны быть статическими. Контекст Store как слабый (используйте mActivityReference для контекста в текущем примере)
Попробуйте с помощью Handler и postDelayed-method внутри onClick