【问题标题】:How to show loading message or dialog or image in an android activity while processing before the activity is finished?如何在活动完成之前处理时在 android 活动中显示加载消息或对话框或图像?
【发布时间】:2012-09-11 13:54:37
【问题描述】:

我有一个Activity“A1”和一个ListActivity“A2”

我从Activity“A1”中的用户那里获取输入,并根据用户给出的输入来处理并生成一个结果列表。然后生成的列表将显示在我的ListActivity“A2”中。

现在,处理输入和生成结果列表需要一点时间。所以我想在这个时候显示一个加载对话框或加载图像或加载消息,这样用户就不会认为应用程序卡住了。

现在我到目前为止尝试过的事情: 是的,我试过AsyncTask! (我知道很多人会建议它)所以现在我在AsyncTask 中进行所有处理。我在onPreExecute 中显示ProgressDialog,在doInBackground 中进行处理并关闭对话框onPostExecute。

但是,对话框出现在ListActivity“A2”开始之前。在那之前,Activity“A1”似乎被卡住了!

我希望当我点击Activity“A1”上的“提交”按钮时,该对话框会立即显示并继续显示,直到出现ListActivity“A2”。

如果您需要更多详细信息,请告诉我。谢谢。

-编辑-

onClick方法中的代码:

ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Processing... Please Wait...");
progressDialog.show();
// Execute task
MyTask myTask = new MyTask(progressDialog);
AsyncTask<String, Void, ArrayList<HashMap<String, String>>> result =
    myTask.execute(userChoice);
Intent intent = new Intent(this, ListActivityA2.class);
// Put results in intent
intent.putExtra("results", resultsList);
// Start result activity
startActivity(intent);

异步任务

public class MyTask extends
            AsyncTask<String, Void, ArrayList<HashMap<String, String>>> {

        ArrayList<HashMap<String, String>> resultsList =
                    new ArrayList<HashMap<String, String>>();
        ProgressDialog progressDialog;

        public MyTask(ProgressDialog progressDialog) {
            this.progressDialog = progressDialog;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected ArrayList<HashMap<String, String>> doInBackground(
                String... params) {
            return doProcess(params[0]);
        }

        @Override
        protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
            progressDialog.dismiss();
            super.onPostExecute(result);
        }

        private ArrayList<HashMap<String, String>> doProcess(String choice) {

            // do processing here
            return arrayList;
        }
}

【问题讨论】:

  • 我实际上建议你在点击时开始一个进度条;在里面做你的计算;关闭时启动 Activity2 :)

标签: android listview android-activity android-asynctask


【解决方案1】:

我已经解决了!

我将创建Intent 的代码移动到onPostExecute

这背后的原因:UI 线程 (Activity "A1") 无论如何都在等待 AsyncTask 返回结果,以便它可以显示 ListActivity "A2"

现在创建意图和启动ListActivity "A2" 正在onPostExecute 中发生,UI 线程可以在不冻结的情况下工作。

感谢您的所有帮助@Aswin Kumar!

希望这个问题和答案对其他人有所帮助。 :)

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您希望在单击提交时显示对话框,将其关闭,然后显示填充数据的活动 A2。

    所以你可以做到这一点:

    1. 在提交的onClick中启动AsyncTask

    2. 显示ProgressDialog

    3. 做处理

    4. onPostExecute,将数据保存为要通过Intent传递给A2的对象,关闭对话框,并使用@中保存的数据启动列表活动A2 987654326@

    5. 在activity A2中,只需解析传入的数据并显示列表即可。

    【讨论】:

    • 感谢您的回复。我已经试过了。单击按钮时,Activity“A1”会冻结在那里(显示单击的按钮),然后在 ListActivity“A2”加载之前弹出ProgressDialog。
    • 如果您在操作运行时看到按钮冻结,则您正在 UI 线程上进行处理(您不应该这样做)。粘贴按钮的onClick() 和AsyncTask 实现的代码,我也许可以帮助你。
    • 我在问题中添加了代码。请看看并告诉我我在做什么错。非常感谢您的帮助! (为简单起见,我更改了变量名称)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多