0

我写了一个 AsynkTask 女巫连接到数据库,然后将结果放在 UI 中。这工作得很好,但后来我想包括一个对话框或其他东西,其他布局女巫显示一个进度条,然后更新用户界面。

好吧,现在布局发生了变化,最后我有了“testGUI”布局,但它没有用 AsynkTask 数据升级。这是代码。非常感谢。

类 DatabaseAsync 扩展 AsyncTask {

    @Override
    protected void onPreExecute(){
        setContentView(R.layout.loading);
    }
    /**
     * Se ejecuta en el hilo secundario, en segundo plano
     */
    @Override
    protected JSONArray doInBackground(Void... params) {
        JSONArray jArray = new JSONArray();
        jArray = DatabaseController
                .rellenarArray("SomeURL");
        return jArray;
    }

    /**
     * Una vez terminado el hilo secundario se ejecuta esto
     */
    @Override
    protected void onPostExecute(JSONArray jArrayFull) {
        setContentView(R.layout.testgui);
         getQuestion(jArrayFull,1);
    }

}
4

2 回答 2

2

不能使用 setContentView()两次。您必须获得对每个视图的引用并通过更改它们的属性来更新它onPostExecute()

于 2012-04-15T21:45:58.363 回答
0

显示进度条后,您的 UI 会如何显示?

如果逻辑如下:

  1. 在 UI 上按 btn 或 sth 启动 DB AsyncTask
  2. 启动对话活动,其中包含您要经常更新的进度条
  3. 数据库任务完成它的工作并使用进度条更新对话活动
  4. 一旦 DB 任务完成,它会通知对话活动它已完成
  5. 对话活动达到 100% 和/或告诉用户一切正常并完成
  6. 用户可以在对话框活动上按下“OK”按钮并返回到用户初始化 DB 任务开始的 UI 活动

...那么您需要使用处理程序来更新对话活动。

一旦用户在第 6 步中按下“确定”,UI 活动就会恢复 - 因此您必须确保要在 UI 活动上显示的任何内容都在您的 UI 活动中得到onResume更新

应避免从您的 asynctask 到 UI 的任何直接调用 - 使用处理程序将您的后台工作任务与 UI 通信。

如果您需要有关如何执行此操作的更多信息 - 只需查找处理程序和进度对话框,有几个教程。

如果您不使用处理程序而是直接从后台工作人员活动中调用 UI 活动方法,则 UI 可能会冻结,甚至在最坏的情况下被 Android 系统删除。

如果您不需要经常更新进度条,那么您可以调用:

textView.setText(result); in your onPostExecute method 

或 UI 元素的任何其他直接设置

于 2012-04-15T21:57:51.670 回答