How to completely kill/remove/delete/stop an AsyncTask

前端 未结 7 2082
终归单人心
终归单人心 2020-11-28 09:57

I made an app that downloads videos from our server. The issue is:

When i cancel the downloading i call:

myAsyncTask.cancel(true)

I

相关标签:
7条回答
  • 2020-11-28 10:22

    AsyncTask does not cancel process on

    myAsynTask.cancel(true) 
    

    For that you have to stop it manually.

    for example you are downloading video in doInBackground(..) in while/for loop.

    protected Long doInBackground(URL... urls) {
    
             for (int i = 0; i < count; i++) {
              // you need to break your loop on particular condition here
    
                 if(isCancelled())
                      break;             
             }
             return totalSize;
         }
    
    0 讨论(0)
  • 2020-11-28 10:29

    Declare in your class

    DownloadFileAsync downloadFile = new DownloadFileAsync();
    

    then On Create

    DownloadFileAsync downloadFile = new DownloadFileAsync();
    downloadFile.execute(url);
    

    in Your Background ()

    if (isCancelled())
        break;
    
    @Override
    protected void onCancelled(){
    
    }
    

    and you can kill your AsyncTask by

    downloadFile.cancel(true);
    
    0 讨论(0)
  • 2020-11-28 10:29

    I have used with success inside an activity with TextView onclick ...

            //inside the doInBackground() ...
    
            try {
            while (true) {
            System.out.println(new Date());
    
            //should be 1 * 1000 for second
            Thread.sleep(5 * 1000);
            if (isCancelled()) {
                  return null;
            }
              }
    
            } catch (InterruptedException e) {
    
            }
    

    and in my onCreate() ...

         //set Activity
         final SplashActivity sPlashScreen = this;
    
         //init my Async Task
         final RetrieveFeedTask syncDo = new RetrieveFeedTask();
         syncDo.execute();
    
         //init skip link
         skip_text = (TextView) findViewById(R.id.skip_text);
         skip_text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                //cancel Async
                syncDo.cancel(true);
    
                //goto/start another activity
                Intent intent = new Intent();
                intent.setClass(sPlashScreen, MainActivity.class);
                startActivity(intent);
                finish();
    
            }
        });
    

    and my xml TextView element ...

       <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/skip_text"
            android:layout_marginTop="20dp"
            android:text="SKIP"
            android:textColor="@color/colorAccent"/>
    
    0 讨论(0)
  • 2020-11-28 10:31

    When you start a separate thread(AyncTask) it has to finish. You have to manually add a cancel statement to your code inside the AsyncTask.

    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.)

    Checkout more in the documentation: http://developer.android.com/reference/android/os/AsyncTask.html

    0 讨论(0)
  • 2020-11-28 10:31

    You better use vogella asyncTask library which have a lot of features like priority and canceling background task. And a great tutorial or using it is here

    0 讨论(0)
  • 2020-11-28 10:36

    I have been researching from the last 2 weeks and I don't get to know that how we kill the Async operation manually. Some developers use BREAK; while checking in for loop. But on my scenario I am not using the loop inside of background thread. But I have got to know how it woks its a stupid logic but works perfectly fine.

    downloadFile.cancel(true);   //This code wont work in any case.
    

    Instead of canceling and doing so much work on background thread turn off the wifi programmatically

    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    wifi.setWifiEnabled(false);
    

    where do you want to kill the operation and turn on it where do you need that.

    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    wifi.setWifiEnabled(true);
    

    What happens is your try block jumps in to the IOException killing the background tasks.

    0 讨论(0)
提交回复
热议问题