我有一个显示数字的活动。该数字来自SharedPreferences
例如
int num=pref.getInt(myAsyncTask.MYNUMBER,0);
SharedPreference
被加载到进行计算的AsyncTask
内(涉及从db
检索数据等)。因此,OnCreate()
活动我运行Asynctask
来计算值。但是,当我启动活动时,该值并不总是更新为最新值。这可能是因为Asynctask
计算新值所花费的时间多于在活动中显示值的操作。如何在Asynctask
完成新进程的过程之前延迟显示值的方法的执行?
[[编辑]]
我删除了共享偏好。我使用onPostExecute()
方法来获得结果。但是,行为是类似的。显示值后返回结果,因此根本看不到任何内容。
答案 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以解决此类情况的原因。