【问题标题】:Wait while Asynctask is finished android等待异步任务完成android
【发布时间】:2014-02-25 19:51:40
【问题描述】:

我正在创建一个移动应用程序,它使用 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 Boolean 为 false 则执行。

片段基于本地数据库显示信息,是默认/启动视图。

我目前通过运行来保护它

   if(initalSync==true){
   // DISPLAY TABLE OF DATA
   }

我知道我不能“暂停”线程,也不能在 onPostExecute 中显示本地表数据,因为我会在其他时间更新数据库。

我基本上希望显示一个进度条并等待异步任务完成,然后让其余代码运行

有什么想法吗?

【问题讨论】:

  • 是的,你等不及了,你需要展示一些东西,而你没有其他东西可以展示。进度条是个好主意。我没有看到的是,你这样做的问题在哪里。

标签: android sqlite android-asynctask background-process


【解决方案1】:

您想提供一个处理程序,您可以将其传递给您的 AsynchTask 听起来。

在AsyncTask中提供setCompletionHandler(myCompletionHandler)等函数。

public void setCompletionHandler(MyCompletionHandler handlerF)
{
    asyncHandler_ = handlerF;
}

然后在您的本地 Activity 中创建您的处理程序。

private class MyCompletionHandler
{
    operationCompleted()
    {
       // updateTableCode ...
    }
}

当你完成AsyncTask中的任务后,调用

asyncHandler_.operationCompleted()

【讨论】:

    【解决方案2】:

    我基本上希望显示一个进度条并等待异步任务完成,然后让其余代码运行

    然后将ProgressBar 添加到您的AsyncTask 并在onPreExecute() 中显示,然后在onPostExecute() 中将其关闭。

    See this answer for an example

    如果您想在任务完成后更新列表,您可以使用interface(如果它位于单独的文件中)。

    See this answer for an example of using an interface with AsyncTask

    【讨论】:

      【解决方案3】:

      使用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.
      

      【讨论】:

        猜你喜欢
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多