用户触发活动开始时显示ProgressDialog(按下按钮)

时间:2012-07-30 11:09:39

标签: android

我有一个扩展Activity这个类作业的类是从手机上的SQLite数据库获取一些数据,以及init。一个ListView,包含数据库中的所有数据。

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

public ArrayList<Case> getFromDatabase() {

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

如前所述,此方法位于扩展Activity的类中。此方法在onCreate方法中调用。如果数据库包含大约15条记录,则此操作大约需要2秒。当用户按下按钮开始此活动时,如何显示正在发生的事情,我该如何显示ProgressDialog?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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();

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

以下是如何执行此操作的示例。基本上查找并使用AsyncTask

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

答案 4 :(得分:0)

使用AsyncTask。本课程提供了解决您所面临问题的方法。

首先,在onPreExecute()方法中,您可以启动ProgressDialog(您在此处编写的代码将在您创建AsyncTask对象的线程上执行,即UI线程在你的情况)

然后,在doInBackground()方法中,您可以从数据库中加载数据。

最后,在onPostExecute()方法中你得到了后台线程的结果,你可以在这里忽略ProgressDialog,因为你再次在UI线程上。

可以找到其他信息here