Java Android settext未在runOnUiThread或asynctask中的onPostExecute中更新textview
我试图在runOnUiThread或asynctask中的onPostExecute中更新textview,但它没有更新 在onCreate中,我正在初始化全局变量\u tvs中的所有文本视图Java Android settext未在runOnUiThread或asynctask中的onPostExecute中更新textview,java,android,multithreading,android-asynctask,textview,Java,Android,Multithreading,Android Asynctask,Textview,我试图在runOnUiThread或asynctask中的onPostExecute中更新textview,但它没有更新 在onCreate中,我正在初始化全局变量\u tvs中的所有文本视图 _tvs.add((TextView) findViewById(R.id.maxCholTextView)); _tvs.add((TextView) findViewById(R.id.maxFatTextView)); _tvs.add((TextView) findViewById(R.id.ma
_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
}
});
}
}
}
任何帮助都将不胜感激。我一直在浏览问题和答案,但仍然没有找到解决问题的方法。谢谢大家! 您可以使用
onProgressUpdate
从AsyncTaskdoInBackground
更新UI,此方法将由android在主(UI)线程上运行。参考资料:@bipinavailu我已经试过了,就像我在问题中说的那样。这仍然不起作用。您可以使用onProgressUpdate
从AsyncTaskdoInBackground
更新UI,此方法将由android在主(UI)线程上运行。参考资料:@bipinavailu我已经试过了,就像我在问题中说的那样。这仍然不起作用。
@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", "");
}
}