2014-02-10 116 views
2

我有這個按鈕,當點擊後,將在我的文本框中輸入的詳細信息保存到Google App Engine,緊接着調用onClickListener後,我有一個意圖,開始一個新的活動,顯示我剛剛輸入的細節。 下面是代碼這樣的:Android的Thread.sleep方法的替代方案

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

現在我希望能夠撥打電話,以startActivitynew EnpointsTask().execute(getApplicationContext)後,被稱爲前等待幾秒鐘。我讀到使用Thread.sleep會導致UI凍結,因此不適合此。還有什麼其他選擇?

+1

爲什麼在開始活動之前需要等待幾秒鐘? –

+0

因此,試圖檢索的數據可以保留。 –

+0

也許你應該使用CountDownTimer? –

回答

3

的解決方案是使用一個處理程序與可運行和使用該方法的處理程序和postDelayed-方法嘗試「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 @覆蓋 \t \t \t公共無效的onClick(視圖v){ \t \t \t \t // TODO自動 - 生成方法存根 \t \t \t \t如果(v.getId()== R.id.userDetailsCaptureButton){ \t \t \t \t \t new EndpointsTask()。execute(getApplicationContext()); \t \t \t \t \t \t \t \t新的處理程序()。postDelayed(新的Runnable(){ \t \t \t \t公共無效的run(){ \t \t \t \t //執行延遲的東西 \t \t \t \t \t startActivity(userProfileDisplayIntent!); \t \t \t \t} \t \t \t 100%),5000L); \t \t \t \t \t \t \t} \t \t}});' 它works.But就像Darkhogg上述文件檔案化管理,最好是等待持久完成 –

+0

如果希望在任務完成後,我建議要執行什麼你可以使用[AsyncTask](http://developer.android.com/reference/android/os/AsyncTask.html)進行研究。使用PreExecute和onPostExecute上的「回調函數」,可以在線程工作完成之前和之後執行某些操作。 doInBackground方法是你的工作可以完成的地方,它運行在不同的線程上。 使用AsyncTask的一個例子可以在這裏找到:http://stackoverflow.com/a/9671602/1534666 – PieterAelse

1

與內部的onClick

2

開始活動

onPostExecute() 

EndpointsTask 

您的終端任務的應該是一個

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

不要將Context作爲參數傳遞給任何線程,因爲它可能導致泄漏。這也意味着內部類應該是靜態的。 存儲上下文作爲弱引用(在當前示例中使用上下文的mActivityReference)

+0

'EndpointsTask'是自動生成的,我不能修改它 –

+0

@OjonugwaOchalifu你是什麼意思,你不能?你可以生成任何你想要的。我確信有一種方法。 –

+0

我的意思是修改它意味着我不得不去改變很多其他的東西。 –