Zulqurnain Jutt
Zulqurnain Jutt

Reputation: 298

Use AsyncTask Except Downloading

Wherever I've seen use of asynctask , it is used for downloading or operation that returns some results. But What if i just want to set a time to time updation of my TextView in activity and do some work at the end .

But at the same time How can i cancel asynctask operation from activity so its onPostExecute , do not run .Like when back button is pressed from activity. Any clues ?

[UPDATE]

For Time to time updation i mean:

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
}

Upvotes: 0

Views: 56

Answers (3)

user1953449
user1953449

Reputation:

Done it myself after some brain storming and searching , i am using CountDownTimer.

in 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();

in onBackPressed():

@Override
public void onBackPressed() {
    counter.cancel();
    counter = null;
    setContentView(R.layout.activity_first);
}

it worked.

Upvotes: 1

Kinnar Vasa
Kinnar Vasa

Reputation: 407

You should use timer task rather than Async task here.

Here is sample:

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++));
                    }
                });
            }
        };

In your onResume() do like:

private Timer timer;
public void onResume() {
   timer = new Timer();
   timer.schedule(timerTask, 1000); // time in milliseconds, you can set accordingly requirement.
}

And onPause() you can stop it by:

public void onPause() {
if (timer != null) {
            timer.cancel();
            timer = null;
        }
}

Upvotes: 0

Logic
Logic

Reputation: 2258

Handler is optimum for your requirement

handler = new Handler();

final Runnable r = new Runnable() {
        public void run() {
            callMethod();
            handler.postDelayed(this, 1000);
        }
    };
handler.postDelayed(r, 1000);

and in order to cancel an ongoing AsyncTask the official docs says it all

A task can be cancelled at any time by invoking cancel(boolean). Invoking this method will cause subsequent calls to isCancelled() to return true.

After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[])

returns.

To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically

from doInBackground(Object[]), if possible (inside a loop for instance.)

Ex: MyTask.cancel(true);

Upvotes: 0

Related Questions