textview的Android settext不在runOnUiThread中更新或在asynctask中的onPostExecute中更新

时间:2017-04-11 12:41:01

标签: java android multithreading android-asynctask textview

我正在尝试更新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", "");
        }
    }

非常感谢任何帮助。我一直在滚动问题和答案,但仍然没有找到解决我的问题的方法。谢谢!

0 个答案:

没有答案