0

我正在学习如何使用 asyncTask,但在尝试实时显示 TextView 时遇到了问题。mainActivity 有几个按钮可以启动新的活动,还有一个 TextView 显示每 200 毫秒更改一次的值。但问题是,直到我单击按钮开始另一个活动时,TextView 才会显示,并且当我按下“后退按钮”返回 mainActivity 时,值不会改变。但是,当我按下按钮开始另一个活动时,它确实会更改值。

private TextView t;
private int counter;
private boolean isUiVisible = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    t = (TextView) findViewById(R.id.counter);
    counter = 0;
}

@Override
public void onStart(){
    super.onStart();
    isUiVisible = true;
    new UpdateUi().execute();
}

@Override
public void onPause(){
    super.onPause();
    isUiVisible = false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private class UpdateUi extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        while (true) {
            if (isUiVisible) {
                counter++;
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                // Ensure the asynkTask ends when the activity ends
                break;
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        t.setText(counter + "");
    }
}

public void callRed(View view){
    Intent intent = new Intent(this, RedActivity.class);
    startActivity(intent);
}

public void callYellow(View view){
    Intent intent = new Intent(this, YellowActivity.class);
    startActivity(intent);
}

我在 onProgressUpdate 中尝试过 setText,但它什么也没显示。我还搜索了其他是否有问题,但似乎它们确实与我的问题相同(一个是 onClickListener,这不是我想要的)。

4

1 回答 1

0

TextView没有显示可能是因为它里面没有文本......如果不查看 layout.xml 文件就无法确定。

你得到了这种行为,因为变量isUiVisible只有在被调用时才变为假onPause(),即当你切换活动时。那时AsyncTask退出他的doInBackground方法并执行onPostExecute,这将一些文本放在TextView使它出现的过程中。

要尝试修复您的代码,您应该publihProgress()在内部调用doInBackground,然后使用在 UIThreadonProgressUpdate中更新您的代码。TextView

于 2013-07-12T23:57:44.147 回答