我正在尝试使用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相同的片段时,一切正常。但我需要在这种情况下嵌套它。为什么会有所作为?
答案 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;
}