我正在创建一个移动应用程序,它使用AsyncTask从远程数据库更新本地数据库。这种方法很好,除了视图(微调器和表数据)依赖于本地数据库中的数据。如果在初始运行asynctask之后这很好,但是在第一次加载时屏幕是空白的。
我有:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences sp = getSharedPreferences("***", 0);
boolean initalSync = sp.getBoolean("***.android.db.inital", false);
if(initalSync==false){
AsyncTaskRunner backgroundTask = new AsyncTaskRunner(this);
backgroundTask.execute();
}
因为从远程数据库远程数据库更新本地数据库是后台任务,并且如果initalsync布尔值为false,则执行此操作。
该片段显示基于本地数据库的信息,是默认/启动视图。
我目前通过运行
来保护它 if(initalSync==true){
// DISPLAY TABLE OF DATA
}
我知道我不能“暂停”线程,我无法在onPostExecute中执行本地表数据的显示,因为我将在其他时间更新数据库。
我基本上希望显示一个进度条并等到asynctask完成然后允许剩下的代码运行
有什么想法吗?
答案 0 :(得分:0)
你想提供一个可以传递给你的AsynchTask的处理程序。
在AsyncTask中提供setCompletionHandler(myCompletionHandler)等函数。
public void setCompletionHandler(MyCompletionHandler handlerF)
{
asyncHandler_ = handlerF;
}
然后在您当地的活动中创建您的处理程序。
private class MyCompletionHandler
{
operationCompleted()
{
// updateTableCode ...
}
}
在AsyncTask中完成任务后,请调用
asyncHandler_.operationCompleted()
答案 1 :(得分:0)
我基本上希望显示一个进度条并等到asynctask完成然后允许剩下的代码运行
然后在ProgressBar
添加AsyncTask
并在onPreExecute()
中显示,然后在onPostExecute()
中将其关闭。
See this answer for an example
如果要在任务完成时更新列表,则可以使用interface
(如果它位于单独的文件中)。
See this answer for an example of using an interface with AsyncTask
答案 2 :(得分:0)
使用progressdialog
并更新您的观看次数onPostExecuted
方法。
public class MyAsyncTask extends AsyncTask ...
onPreExecute
// create progress dialog
// start dialog
doBackground
// get your data while progress dialog is shown
onPostExecuted
// dismiss dialog
// update your views.