AsyncTask,Insert,在Android中选择错误的执行顺序

时间:2014-10-29 09:40:09

标签: android database select android-asynctask insert

嘿,伙计们,

我目前正在调试一个从数据库中检索某些数据的应用程序,它会在列表视图中显示它。但是,它使用额外的方法在日期对这些结果进行排序,并在名为" Gesorteerd op datum"的类别中显示。这包含其中包含月份的子类别。例如:

Link screenshot because i miss 1 reputation to upload a image.

正如您所看到的那样,打开的部分是静态的,我使用一个函数来选择某个时间段之间的所有数据,然后在几个月内对这些数据进行排序,然后将这些数据重新插入到数据库中以使事物像动态一样可能(我也插入了定制的" Gesorteerd op Datum"以及几个月)。但是,当你第一次使用这个应用程序并打开这个片段时," Gesorteerd on Datum"部分完全缺失。然而,通过向后按,然后再次进入那里。

所以问题是插入需要更长的时间来完成选择和显示所有列表项的功能。我尝试使用2个Asynctasks来解决这个问题。

First asynctask:DoInBackground函数插入" Gesorteerd op数据"和al submonths,这使用一个监听器,以便它完成后不会做下一件事。然后onPostExecute运行一个显示类别的函数。但是在这里它已经出错了,因为" gesorteerd op datum"没有添加到数组中,稍后用于显示列表视图。

第二个Asynctask:DoInBackground使用一个函数来获取和按日期对事件进行排序,然后插入它们。然后onPostexecute获取所有事件,包括" gesorteerd op datum"事件并在下面的列表视图中显示它们。如上所述,它没有做它应该做的事情。

任何人都知道哪里出错了?因为在阅读了Asynctask文档后,我知道它不应该在第一次插入完成后加载类别。但它仍然会提前加载它们。

/*
 * Insert Static categories into database.
 * Easier to manipulate and prevents unnecessary code.
 */
class Static extends AsyncTask<Object, Object, Object>{     
    @Override
    protected Object doInBackground(Object... params) {
        // TODO Auto-generated method stub
        insertStaticData();
        return null;
    }

    @Override
    protected void onPostExecute(Object result)
    {
        getAllStaticData(); 
        new async().execute();
    }
}

/*
 * Insert Static categories into database.
 * Easier to manipulate and prevents unnecessary code.
 */
class async extends AsyncTask<Object, Object, Object>{      

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        toggleLoadingView(mLoading, mExpandableListView, mRootView, true);
    }

    @Override
    protected Object doInBackground(Object... params) {
        // TODO Auto-generated method stub
        if (sCurrentRadius != 0 && mLastLocation != null) {
            loadCursor(mLastLocation, sCurrentRadius); 
        } else{
            loadCursor();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object result)
    {
        getAllDynamicData();
    }
}

这些是我的Asyncs根据以下建议编辑的。他们现在展示它们,但它不会显示它应该显示的所有月份。当我重新加载它时会显示它们。

1 个答案:

答案 0 :(得分:1)

肮脏的解决方案:

制作处理程序并将延迟发布X秒,以便完成插入操作。 X可能会因你需要做多少插入和填充而变化。

  /*
   * Run the Async and then after a delay load the listview needed. 
   */
  new Static().execute();

  final Handler handler = new Handler();
  handler.postDelayed(new Runnable() {
  @Override
         public void run() {
            if (sCurrentRadius != 0 && mLastLocation != null) {
                loadCursor(mLastLocation, sCurrentRadius); 
            } else{
                loadCursor();
            }
        }
    }, 4000);

/*
     * Insert Static categories into database.
     * Easier to manipulate and prevents unnecessary code.
     */
    class Static extends AsyncTask<Object, Object, Object>{     

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            toggleLoadingView(mLoading, mExpandableListView, mRootView, true);
        }

        @Override
        protected Object doInBackground(Object... params) {
            // TODO Auto-generated method stub
            insertStaticData();
            return null;
        }

        @Override
        protected void onPostExecute(Object result)
        {
            getAllStaticData();
        }
    }