我正在尝试更新runOnUiThread中的textview或asynctask中的onPostExecute,但它没有更新。
在onCreate中,我正在初始化全局变量_tvs中的所有textview。
_tvs.add((TextView) findViewById(R.id.maxCholTextView));
_tvs.add((TextView) findViewById(R.id.maxFatTextView));
_tvs.add((TextView) findViewById(R.id.maxSaturatedFatTextView));
_tvs.add((TextView) findViewById(R.id.maxFiberTextView));
_tvs.add((TextView) findViewById(R.id.maxSaltTextView));
_tvs.add((TextView) findViewById(R.id.maxCalTextView));
_tvs.add((TextView) findViewById(R.id.maxCarbTextView));
_tvs.add((TextView) findViewById(R.id.maxSugarTextView));
_tvs.add((TextView) findViewById(R.id.maxProteinTextView));
然后我尝试了三种不同的方式来更新它。在第一种方式中,我尝试从doInBackGround函数调用它并在runOnUiThread中设置文本。在第二个选项中,我删除了runOnUiThread代码并从onPostExecute调用了updateView。 第三个选项我把settext放在runOnUiThread代码之外,就像你在下面看到的那样。这适用于初始化它,当活动从另一个线程启动时更新它,但当用户按下后退按钮时恢复活动时崩溃。崩溃的原因是只有创建视图层次结构的原始线程才能触及其视图。我不知道为什么它在初始化时不会抱怨,当另一个活动调用启动活动时更新它,但是当活动恢复时它会更新。
private class DatabaseLogger extends AsyncTask<String, String, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(String... type) {
// TODO Auto-generated method stub
updateView();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//updateView();
}
private void updateView() {
int progress;
// proteins, carbs, sugars, fats, cals, cholesterol, salt
if (_current != null && _diet != null && _diet.size() > 0 && _current.size() > 0) {
for (int i = 0; i < _pbs.size(); i++) {
final ProgressBar pb = _pbs.get(i);
final Float current = _current.get(i);
final TextView tv = _tvs.get(i);
Float diet = _diet.get(i);
progress = Math.round(((current / diet)) * 100);
int y = 50 + (int) (progress * 3.9);
if (y > 400)
y = 400; // Cap is 400
// If I put this code inside the runOnUiThread the textView doesnt update
tv.setY(-y);
tv.setText("" + Math.round(current));
final int finalProgress = progress;
runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setMax(50);
pb.setProgress(20);
pb.setProgress(0);
pb.setMax(100);
pb.setProgress(finalProgress); // Force update -> Its an android bug thats not fixed yet http://stackoverflow.com/questions/4348032/android-progressbar-does-not-update-progress-view-drawable
}
});
}
} else if (_current == null || _current.size() == 0) {
reInitPbs();
}
}
private void reInitPbs() {
for (int i = 0; i < _pbs.size(); i++) {
final ProgressBar pb = _pbs.get(i);
final TextView tv = _tvs.get(i);
tv.setY(-50);
tv.setText("" + 0);
runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setMax(50);
pb.setProgress(20);
pb.setProgress(0);
pb.setMax(100);
pb.setProgress(0); // Force update -> Its an android bug thats not fixed yet http://stackoverflow.com/questions/4348032/android-progressbar-does-not-update-progress-view-drawable
}
});
}
}
}
我的活动onResume看起来像这样。
@Override
public void onResume() { // After a pause OR at startup
super.onResume();
if (_user != null) {
ImageView avatarView = (ImageView) findViewById(R.id.avatarView);
int id = getApplicationContext().getResources().getIdentifier(_user.getAvatar().getType().toString().concat(_user.getAvatar().getStatus().toString()).toLowerCase(), "drawable", getApplicationContext().getPackageName());
avatarView.setImageResource(id);
setFeedbackMessage();
getDataFromDatabase("overview", "");
}
}
非常感谢任何帮助。我一直在滚动问题和答案,但仍然没有找到解决我的问题的方法。谢谢!