无论我在哪里使用 asynctask ,它都会用于下载或返回一些结果的操作。但是,如果我只是想在活动中设置我的TextView更新时间并在最后做一些工作,那该怎么办。
但与此同时我如何取消来自活动的asynctask操作,因此其 onPostExecute ,不会运行.Like当从活动按下后退按钮时。有线索吗?
对于时间更新,我的意思是:
TextView tv = findViewById(R.id.disco);
try{
for(int i=0;i<10000;i++){
Thread.sleep();
tv.setText(" "+i);
}
}
catch(Exception e){}
/* i know i can achieve finally in onPostExecute but what if i want to cancel it during runtime*/
finally{
// do some more operations after execution
}
答案 0 :(得分:1)
经过一些脑力激荡和搜索后我自己完成了,我正在使用CountDownTimer。
在OnCreate()中:
counter = new CountDownTimer((PROGRESSSECONDS+1)*1000,1000) {
int collapsed = 0;
@Override
public void onTick(long millisUntilFinished) {
collapsed++;
pb.setProgress(collapsed);
}
@Override
public void onFinish() {
Intent in = new Intent(FirstActivity.this,PointsDrawerActivity.class);
startActivity(in);
}
};
counter.start();
onBackPressed():
@Override
public void onBackPressed() {
counter.cancel();
counter = null;
setContentView(R.layout.activity_first);
}
它有效。
答案 1 :(得分:0)
您应该在此处使用计时器任务而不是Async任务。
以下是样本:
private TimerTask timerTask;
int i = 0;
timerTask = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
//Do your text view update here.
tv.setText(" "+ (i++));
}
});
}
};
在onResume()中,请执行以下操作:
private Timer timer;
public void onResume() {
timer = new Timer();
timer.schedule(timerTask, 1000); // time in milliseconds, you can set accordingly requirement.
}
onPause()你可以通过以下方式阻止它:
public void onPause() {
if (timer != null) {
timer.cancel();
timer = null;
}
}
答案 2 :(得分:0)
Handler
最适合您的要求
handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
callMethod();
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(r, 1000);
并且为了取消正在进行的AsyncTask
官方文档说明了一切
可以通过调用cancel(boolean)随时取消任务。 调用此方法将导致后续调用isCancelled() 返回true。
After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[])
回报。
To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically
来自doInBackground(Object []),如果可能的话(在循环内部) 实例。)
例如:MyTask.cancel(true);