如何等待活动中的更新值

时间:2012-02-23 19:28:41

标签: android android-asynctask sharedpreferences

我有一个显示数字的活动。该数字来自SharedPreferences例如

int num=pref.getInt(myAsyncTask.MYNUMBER,0);

SharedPreference被加载到进行计算的AsyncTask内(涉及从db检索数据等)。因此,OnCreate()活动我运行Asynctask来计算值。但是,当我启动活动时,该值并不总是更新为最新值。这可能是因为Asynctask计算新值所花费的时间多于在活动中显示值的操作。如何在Asynctask完成新进程的过程之前延迟显示值的方法的执行?

[[编辑]] 我删除了共享偏好。我使用onPostExecute()方法来获得结果。但是,行为是类似的。显示值后返回结果,因此根本看不到任何内容。

3 个答案:

答案 0 :(得分:0)

只需使用listener概念,或者只是将您的Activity“传递”到asynctask,这样就可以调用主线程。

答案 1 :(得分:0)

如果在启动活动时该值未显示正确,则应设置View to View.GONE的可见性,使其不显示,然后在获得结果时将可见性更改回可见。要更新值,您可以在您的活动上实现一个由AsyncTask调用的侦听器。

如果需要花费大量时间(超过几秒钟),您可能还想使用进度对话框,以便用户了解他们需要等待。

答案 2 :(得分:0)

如果计算时间不超过几秒钟,最简单的解决方案是使用AsyncTask.get(),此方法将阻止UI线程执行并使UI线程等待AsyncTask完成:

public void onCreate(Bundle savedInstanceState) {
  ... ...
  MyAsyncTask myAsyncTask = nee MyAsyncTask();
  myAsyncTask.execute();
  myAsyncTask.get(); // alternatively you can use AsyncTask.(long timeout, TimeUnit unit)
  ... ...
}

请记住,它会阻止UI执行,如果你的计算时间超过5秒,你可能会得到ANR异常。

由于您已经使用了AsyncTask,因此更合理的解决方案是将显示值的方法的执行移动到AsyncTask.onPostExecute()中,这就是为什么在API中存在AsyncTask以解决此类情况的原因。