0

我有一个扩展Activity这个类的类,工作是从手机上的数据库中获取一些数据SQLite,然后初始化。aListView包含数据库中的所有数据。

这是从数据库中获取信息的方法:

public ArrayList<Case> getFromDatabase() {

    ArrayList<Case> c = db1.getAllContacts();    
    return c; 
}

如前所述,该方法在一个扩展类内部,Activity该方法在该方法中被调用onCreate。如果数据库包含大约 15 条记录,则此操作大约需要 2 秒。当用户按下按钮启动此活动时,如何显示 ProgressDialog,只是为了显示正在发生的事情?

4

5 回答 5

1

我建议您将数据库包装在 ContentProvider 中,然后使用 CursorLoader 为 ListActivity 提供动力。这将避免占用您的 UI 线程,避免需要进度条,在数据库内容更改时更新列表等等。(如果您只想要设备中的联系人,那么已经有一个联系人内容提供程序。)

于 2012-07-30T11:15:17.270 回答
1

通过在 onCreate 方法之外声明 ProgressDialog 变量来创建 ProgressDialog 作为活动的字段:

ProgressDialog pd=null;

通过在 onCreate 方法之外编写以下块,在 Activty 中创建一个 Handler 作为字段。

Handler handler=new Handler()
{
   public void handleMessage(Message msg)
   {
      pd.dismiss();
      //do other operations on EventThread.
      ArrayList<Case> c= (ArrayList<Case>)msg.obj;
      //Process c
   }
}

现在在 onCreate 方法中用以下代码替换您的代码:

pd=ProgressDialog.show(YourActivity.this, "title", "subtitle");
Thread thread=new Thread()
{
   public void run()
   {
       ArrayList<Case> c = db1.getAllContacts();
       Message msg=handler.obtainMessage();
       msg.obj=c;
       handler.sendMessage(msg);
   }
};
thread.start();
于 2012-07-30T11:18:03.757 回答
0

使用 AsyncTask 显示 ProgressDialog 并在后台获取数据。

new FetchRSSFeeds().execute();

然后创建类

private class FetchRSSFeeds extends AsyncTask<String, Void, Boolean> {

 private ProgressDialog dialog = new ProgressDialog(HomeActivity.this);

    /** progress dialog to show user that the backup is processing. */
    /** application context. */

    protected void onPreExecute() {
        this.dialog.setMessage("Please wait");
        this.dialog.show();
    }

    protected Boolean doInBackground(final String... args) {
        try {

            /**
             * Fetch the data
             */
            Utilities.arrayRSS = objRSSFeed.FetchRSSFeeds(Constants.Feed_URL);
            return true;
        } catch (Exception e) {
            Log.e("tag", "error", e);
            return false;
        }
    }

    @Override
    protected void onPostExecute(final Boolean success) {

        if (dialog.isShowing()) {
            dialog.dismiss();
        }

          // Setting data to list adaptar
          setListData();
          txtTitle.setText(Utilities.RSSTitle);
    }
}
于 2012-07-30T11:15:21.247 回答
0

这是一个如何做到这一点的例子。基本上查找和使用 AsyncTask

http://www.vogella.com/articles/AndroidPerformance/article.html

于 2012-07-30T11:17:26.413 回答
0

使用AsyncTask. 此类提供了解决您面临的问题的方法。

首先,在onPreExecute()方法中你可以启动一个ProgressDialog(你在这里写的代码,将在你创建AsyncTask对象的线程上执行,即你的情况下的UI线程)

然后,在doInBackground()您从数据库加载所有数据的方法中。

最后,在onPostExecute()您从后台线程获得结果的方法中,您可以在此处关闭ProgressDialog,因为您再次位于 UI 线程上。

可以在此处找到其他信息。

于 2012-07-30T11:17:39.517 回答