执行AsyncTask后刷新TextView

时间:2014-02-23 10:27:08

标签: java android android-asynctask textview

我在AsyncTask中获取所需数据后刷新TextView时遇到问题。如果它是单个文件,一切都会好的,但我决定拆分它。在第一类我有TextViews,在另一个我有几个AsyncTasks从网上下载数据。 我已经尝试过了:

mainActivity:

summary.countCash(); // it runs AsyncTask in summary class
while (summary.wait) {
    // do nothing and wait until AsyncTask finishes
}

eCash.setText("Cash: " + summary.cash);

并在AsyncTask中:

Boolean wait = false;

@Override
protected void onPreExecute() {
    wait = true;
}

@Override
protected void onPostExecute(Integer result) {
    cash = result;
    wait = false;
}

不幸的是它不起作用。应用程序冻结。 我也试着设置

wait = false;

在doInBackground的末尾,但是在main中我得到了summary.cash = 0,这可能是因为它在onPostExecute中更新值之前刷新了TextView。

2 个答案:

答案 0 :(得分:1)

在您的异步任务中。

@Override
protected void onPostExecute(Integer result) {
    eCash.setText("Cash: " + result);
}

摆脱你的while语句。你不需要它。 Fyi,你是通过等待锁定ui线程,首先打败了asynctask的目的。

希望这有帮助

答案 1 :(得分:0)

嗯,我不建议坚持不断的循环。它将使活动保持忙碌状态。只需从AsyncTask类调用一个回调方法。

AsyncTask

中的

private _mainActivity;

// constructor
public AsyncTask(MainActivity ma) {
    // passing reference
    _mainActivity = ma;
}

@Override
protected void onPostExecute(Integer result) {
    _mainActivity.updateTextview(result);
}

然后在MainActivity

public void updateTextview(Integer result) {
    // update textview using result
}

这样,您的MainActivity就不会陷入循环中。此外,您可以在主活动中添加流程对话框,并在updateTextview方法中将其停止。

编辑1

您可以使用AsyncTask类作为对象来调用它。我不知道班级名称,假设它是AsyncTask,然后使用MainActivity中的下一个

AsyncTask at = new AsyncTask(this);
at.execute();

this指向MainActivity本身,它将作为参考。然后,AsyncTask类可以使用该引用来调用updateTextview()方法的回调方法。