等待Asynctask完成android

时间:2014-02-25 19:51:41

标签: android sqlite android-asynctask background-process

我正在创建一个移动应用程序,它使用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完成然后允许剩下的代码运行

有什么想法吗?

3 个答案:

答案 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.