package com.octo.android.robospice.motivations.asynctask;
import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;
import com.octo.android.robospice.motivations.R;
import com.octo.android.robospice.motivations.common.DemoActivity;
/**
* Basic asynchronous job implementation demo class. It presents usage of a simple {@link AsyncTask}. It will display
* progress of the task.
*
* @author sni
*
*/
public class AsyncTaskAsInnerClassDemoActivity extends DemoActivity {
private AsyncTaskCounter asyncTask;
@Override
public void startDemo() {
asyncTask = new AsyncTaskCounter();
asyncTask.execute();
}
@Override
public void stopDemo() {
if ( asyncTask != null ) {
asyncTask.cancel( true );
}
}
@Override
public String getDemoSubtitle() {
return getString( R.string.text_basic_async_task_name );
}
@Override
public String getDemoTitle() {
return getString( R.string.text_async_task_example );
}
@Override
public String getDemoExplanation() {
return "async_task_inner_class.html";
}
/**
* Basic async task usage. Note that this class is an inner class of an Activity. Thus, it holds an invisible
* reference on the outer class instance of this Activity. This produces a memory leak : it the asyntask lasts for
* long, it keeps the activity alive, whereas android would like to get rid of it as it can no longer be displayed.
* If all activities use this technique of an inner AsyncTask, then you will quickly get a memory leak as none of
* those activities will get garbage collected by the android system. If you don't understand why activities must
* die, please refer to the activity life cycle of the {@link Activity} documentation.
*
* @author sni
*
*/
public class AsyncTaskCounter extends AsyncTask< Void, Integer, Void > {
private static final int SLEEP_TIME = 200;
@Override
protected Void doInBackground( Void... params ) {
for ( int i = 0; i < MAX_COUNT && !isCancelled(); i++ ) {
try {
Thread.sleep( SLEEP_TIME );
} catch ( InterruptedException e ) {
e.printStackTrace();
}
Log.d( getClass().getSimpleName(), "Progress value is " + i );
Log.d( getClass().getSimpleName(), "getActivity is " + AsyncTaskAsInnerClassDemoActivity.this );
Log.d( getClass().getSimpleName(), "this is " + this );
publishProgress( i );
}
return null;
}
@Override
protected void onPostExecute( Void result ) {
super.onPostExecute( result );
}
@Override
protected void onProgressUpdate( Integer... values ) {
super.onProgressUpdate( values );
progressBar.setProgress( values[ 0 ] );
}
}
}