Note that there are some explanatory texts on larger screens.

plurals
  1. POCannot cancel running AsyncTask in AsyncTaskLoader
    primarykey
    data
    text
    <p>I want to cancel running AsyncTask (in AsyncTaskLoader) when the user clicks the home button. Here is what I created so far:</p> <pre><code>package cz.davidliska.android.loaders; import java.text.SimpleDateFormat; import java.util.Date; import android.content.Context; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; import android.util.Log; public class MainActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks&lt;Date&gt; { private static final String TAG = "loader"; private Date date; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LoaderManager.enableDebugLogging(true); getSupportLoaderManager().initLoader(0, savedInstanceState, this); } private static class DateLoader extends AsyncTaskLoader&lt;Date&gt; { public static final String STATE_DATE_LOADER = "dateloader.state"; private Date mDate; public DateLoader(Context context, Bundle savedInstanceState) { super(context); if (savedInstanceState != null) { long timeStamp = savedInstanceState.getLong(STATE_DATE_LOADER); if (timeStamp != 0L) mDate = new Date(timeStamp); } } @Override protected void onStartLoading() { Log.d(TAG, "Loader.onStartLoading()"); if (mDate != null) { deliverResult(mDate); } else { forceLoad(); } } @Override public void deliverResult(Date data) { super.deliverResult(data); Log.d(TAG, "Loader.deliverResult()"); mDate = data; } @Override protected void onStopLoading() { super.onStopLoading(); cancelLoad(); // try to cancel AsyncTask Log.d(TAG, "Loader.onStopLoading()"); } @Override protected void onForceLoad() { // overridden in AsyncTaskLoader super.onForceLoad(); Log.d(TAG, "Loader.onForceLoad()"); } @Override protected void onReset() { super.onReset(); mDate = null; Log.d(TAG, "Loader.onForceLoad()"); } @Override public void onContentChanged() { super.onContentChanged(); Log.d(TAG, "Loader.onContentChanged()"); } @Override protected void onAbandon() { super.onAbandon(); Log.d(TAG, "Loader.onContentChanged()"); } @Override public Date loadInBackground() { // AsyncTaskLoader only Log.d(TAG, "Loader.loadInBackground()"); try { // there will be some HttpClient.execute() while(true) { Thread.sleep(100); Log.d(TAG, "Loader.loadInBackground() still running"); } } catch (InterruptedException e) { Log.d(TAG, "Loader.loadInBackground() interupted"); } Log.d(TAG, "Loader.loadInBackground() finished"); return new Date(); } @Override public void onCanceled(Date data) { // AsyncTaskLoader only super.onCanceled(data); Log.d(TAG, "Loader.onCanceled()"); } @Override protected Date onLoadInBackground() { // AsyncTaskLoader only Log.d(TAG, "Loader.onContentChanged()"); return super.onLoadInBackground(); } @Override public void abandon() { Log.d(TAG, "Loader.abandon()"); super.abandon(); } @Override public boolean cancelLoad() { Log.d(TAG, "Loader.cancelLoad()"); return super.cancelLoad(); } @Override public void forceLoad() { Log.d(TAG, "Loader.forceLoad()"); super.forceLoad(); } @Override public boolean isAbandoned() { Log.d(TAG, "Loader.isAbandoned()"); return super.isAbandoned(); } @Override public boolean isReset() { Log.d(TAG, "Loader.isReset()"); return super.isReset(); } @Override public boolean isStarted() { Log.d(TAG, "Loader.isStarted()"); return super.isStarted(); } @Override public void reset() { Log.d(TAG, "Loader.reset()"); super.reset(); } @Override public void stopLoading() { Log.d(TAG, "Loader.stopLoading()"); super.stopLoading(); } @Override public boolean takeContentChanged() { Log.d(TAG, "Loader.takeContentChanged()"); return super.takeContentChanged(); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (date != null) outState.putLong(DateLoader.STATE_DATE_LOADER, date.getTime()); } public Loader&lt;Date&gt; onCreateLoader(int id, Bundle args) { Log.d(TAG, "LoaderCallback.onCreateLoader()"); if (args != null) Log.d(TAG, "bundle: " + args.getLong(DateLoader.STATE_DATE_LOADER)); return new DateLoader(this, args); } public void onLoadFinished(Loader&lt;Date&gt; loader, Date data) { Log.d(TAG, "LoaderCallback.onLoadFinished(): " + new SimpleDateFormat("dd/MM/yyyy").format(data)); date = data; } public void onLoaderReset(Loader&lt;Date&gt; loader) { Log.d(TAG, "LoaderCallback.onLoaderReset()"); } } </code></pre> <p>So in onStopLoading() i am calling cancelLoad(), which i think should cancel current task, but AsyncTask in AsyncTaskLoader is still running (while loop in loadInBackground() is still in progress).</p> <p>The problem is maybe in cancelLoad() method in "java.android.support.v4.content.AsyncTaskLoader.java", where mTask.cancel(boolean) is called with "false" in arguments:</p> <pre><code>public boolean cancelLoad() { ... boolean cancelled = mTask.cancel(false); </code></pre> <p>Is there any chance to cancel running AsyncTask in AsyncTaskLoader?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload