2014-02-10 4 views
2

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

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

Зачем вам нужно подождать пару секунд до начала действия? –

+0

Чтобы данные, которые я пытаюсь извлечь, могут быть сохранены. –

+0

Возможно, вы должны использовать CountDownTimer? –

ответ

3

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

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

После вашего примера я сделал 'submitButton.setOnClickListener (нового View.OnClickListener() { \t \t \t \t \t \t @Override \t \t \t общественного недействительный OnClick (View v) { \t \t \t \t // TODO Auto -порожденной метод заглушки \t \t \t \t, если (v.getId() == R.id.userDetailsCaptureButton) { \t \t \t \t \t новый EndpointsTask(). Execute (getApplicationContext()); \t \t \t \t \t \t \t \t новый Handler().postDelayed (новый Runnable() { \t \t \t \t общественности недействительным запуска() { \t \t \t \t // У отсроченной материал \t \t \t \t \t startActivity (userProfileDisplayIntent)! \t \t \t \t} \t \t \t \t}, 5000L); \t \t \t \t \t \t \t} \t \t}}); ' Это works.But так же, как Darkhogg metioned выше, то лучше дождаться завершения настойчивости –

+0

Если вы хотите, чтобы выполнить что-то после того, как задача закончена, я предлагаю вам нужно изучить [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html). С его «обратными вызовами» onPreExecute и onPostExecute вы можете делать что-то до и после выполнения потоковой работы. Метод doInBackground - это то, где ваша работа может быть выполнена, она работает в другом потоке. Пример использования AsyncTask можно найти здесь: http://stackoverflow.com/a/9671602/1534666 – PieterAelse

1

Попробуйте его с обработчиком и postDelayed-метода внутри OnClick

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

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

+0

«EndpointsTask» был автоматически сгенерирован, я не могу его изменить –

+0

@OjonugwaOchalifu, что вы имеете в виду, что не можете ? Вы можете генерировать все, что хотите. Я уверен, что есть способ. –

+0

Я имел в виду изменение, это означало бы, что мне придется пойти и изменить многое другое. –

Смежные вопросы