使用setText()更新TextView在AsyncTask onProgressUpdate()中不起作用

时间:2014-06-25 17:47:31

标签: android android-asynctask textview

我正在尝试使用AsyncTask更新我的用户界面,其中包含有关后台任务的信息。这是我的onProgressUpdate()方法。

@Override
protected void onProgressUpdate(final String... params) {

    Log.d(TAG, "onProgressUpdate()");

    StringBuilder currentParam = new StringBuilder();
    StringBuilder statusMessage = new StringBuilder();

    txtInputFile.setText("Input: " + params[0]);
    txtOutputFile.setText("Output: " + params[1]);
    txtPercentDone.setText("" + MainActivity.getProgressStatus(statusMessage, currentParam) + "%");

    txtStatusMessage.setText(statusMessage);
    txtParamName.setText(currentParam);


}

但是,没有TextViews更新其文本。我在publishProgress()方法中调用了doInBackground()。日志显示正确调用onProgressUpdate()。我知道TextViews已经实例化,并且不是null。有谁知道发生了什么事?

更新
这可能与此代码在嵌套片段(ui正在更新)中的事实有关。当我显示与root相同的片段时,一切正常。但我需要在这种情况下嵌套它。为什么会有所作为?

2 个答案:

答案 0 :(得分:0)

AsyncTask传递您的参数和背景,然后使用runOnUiThread进行设置。如果您不能将您的日志放在此处以了解问题。

答案 1 :(得分:0)

每个publishProgress()都会在UI线程中排队,因此,如果您的doInBackground在所有onProgressUpdate()之前结束,则只会看到您上次的ui更新。

尝试测试添加Thread.sleep(MILLISECONDS)以检查ui线程的并发性。

    @Override
    protected Void doInBackground(Void... params) {
        for (int i = 0; i < SOME_VALUE ;i++) {
            publishProgress(""+i);
            try {
                Thread.sleep(MILLISECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;
    }