在AsyncTask之后,方法不会更新UI

时间:2012-04-15 21:33:19

标签: java android json android-asynctask

我写了一个AsynkTask女巫连接到数据库,然后将结果放在UI中。这很完美,但后来我想要包含一个Dialog或者其他东西,其他布局女巫会显示progressBar,然后更新UI。

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

class 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);
    }

}

2 个答案:

答案 0 :(得分:2)

无法使用 setContentView()两次。您必须获得对每个视图的引用,并通过在onPostExecute()中更改其属性来更新它。

答案 1 :(得分:0)

显示进度条后,您的用户界面如何显示?

如果逻辑如下:

    UI上的
  1. 按btn或sth启动DB AsyncTask
  2. 启动对话框活动,其中包含您要经常更新的进度条
  3. 数据库任务执行它并使用进度条
  4. 更新对话框活动
  5. 完成数据库任务后,它会通知对话框,它已完成
  6. 对话框活动达到100%和/或告诉用户一切正常并完成
  7. 用户可以在对话框活动上按“确定”btn并返回用户初始化数据库任务开始的UI活动
  8. ...然后您需要使用处理程序来更新对话框活动。

    用户在步骤6中按“确定”后,UI活动将恢复 - 因此您必须确保在UI活动的onResume中更新您要在UI活动中显示的内容< / p>

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

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

    如果您不使用处理程序但直接从backgroudn worker活动调用UI活动方法,则UI可能会冻结,甚至在最坏的情况下被Android系统删除。

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

    textView.setText(result); in your onPostExecute method 
    

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