使用AsyncTask除了下载

时间:2015-07-20 11:51:41

标签: android android-asynctask

无论我在哪里使用 asynctask ,它都会用于下载或返回一些结果的操作。但是,如果我只是想在活动中设置我的TextView更新时间并在最后做一些工作,那该怎么办。

但与此同时我如何取消来自活动的asynctask操作,因此其 onPostExecute ,不会运行.Like当从活动按下后退按钮时。有线索吗?

[UPDATE]

对于时间更新,我的意思是:

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
}

3 个答案:

答案 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);