2014-02-10 121 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

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