Actually my async task is not a inner static class, and it still has a
explicit reference to the activity that i refresh,

*here's the parent activity:*

public abstract class ParentActivity extends Activity{

protected static int progressBarstate=ProgressBar.GONE;
protected static int themeId;

private ParentActivityTask task=null;

//this method will get the id for the layout
public abstract int getLayoutId();
//this method will launch respejcting oncreate logic for each activity
public abstract void initActivity();
//thi smethod will return window header menu context text string
public abstract String getWindowTitle();
//this method is used to refresh contents for a screen
public abstract String updateResultsInUi();
//nethod for definined specific theme
public abstract int getThemeId();

@Override
protected void onCreate(Bundle savedInstanceState) {


//set theme first for showing correct header
setTheme(getThemeId());

super.onCreate(savedInstanceState);

themeId=getThemeId();
//in case the screen will have a header
if(getThemeId()!=R.style.CustomThemeNoHeader){

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

setContentView(getLayoutId());

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.custom_window_title);

//save progressview on application context
QuadrosMobileApplicationContext.getInstance().setProgressView((LinearLayout)
findViewById(R.id.progressView));

//set text header
((TextView)findViewById(R.id.header_title)).setText(getWindowTitle());

progressRefreshState(progressBarstate);

}else
{
setContentView(getLayoutId());
}

//execute subactivity logic
initActivity();

}

/**
 * check for loading/spinner icon in
 *  case there's a thread working in background
 */
@Override
public void onRestart () {
super.onRestart();
if(getThemeId()!=R.style.CustomThemeNoHeader){
QuadrosMobileApplicationContext.getInstance().setProgressView((LinearLayout)
findViewById(R.id.progressView));
progressRefreshState(progressBarstate);

}
}

@Override
protected void onResume() {
super.onResume();

QuadrosMobileApplicationContext.getInstance().refreshAsyncTasksActivity(this);
}


@Override
protected void onPause() {
super.onPause();

QuadrosMobileApplicationContext.getInstance().clearActivityAsyncTasks();
}

@Override
public Object onRetainNonConfigurationInstance() {
if(task!=null)
task.detach();

return(task);
}

/**
 * refresh static references for both progress
 * info views and set visibility state
 */
private void progressRefreshState(int state) {
findViewById(R.id.progressView).setVisibility(state);
}

 /**
 * do asynctask for background work
 */
public void doAsyncTask(){
//get task back in case of rotation
task= (ParentActivityTask)getLastNonConfigurationInstance();

if(task==null){
task= new ParentActivityTask(this);
task.execute();
//add to the set of tasks
QuadrosMobileApplicationContext appliContext=
(QuadrosMobileApplicationContext)getApplicationContext();
appliContext.getAsyncTasks().add(task);
}else{
task.attach(this);
}
}
 }

here's the async task as non inner class:

ublic class ActivityTask extends AsyncTask<Void, Void, String>{
ParentActivity activity=null;


public ActivityTask(QuadrosMobileActivity activity) {

attach(activity);
}

@Override
protected void onPreExecute() {

if(QuadrosMobileActivity.themeId!=R.style.CustomThemeNoHeader){
ParentActivity.findViewById(R.id.progressView).setVisibility(ProgressBar.VISIBLE);
}
QuadrosMobileActivity.progressBarstate=ProgressBar.VISIBLE;
}

@Override
protected String doInBackground(Void... params) {
 return ParentActivity.updateResultsInUi();
}

@Override
protected void onPostExecute(String result) {
 if(activity!=null)
Toast.makeText(activity, result, Toast.LENGTH_LONG).show();
QuadrosMobileApplicationContext appliContext=
QuadrosMobileApplicationContext.getInstance();
appliContext.getAsyncTasks().remove(this);

if(appliContext.getAsyncTasks().isEmpty()){
if(QuadrosMobileActivity.themeId!=R.style.CustomThemeNoHeader){
ParentActivity .findViewById(R.id.progressView).setVisibility(ProgressBar.GONE);
}
QuadrosMobileActivity.progressBarstate=ProgressBar.GONE;
}
}

void detach() {
activity=null;
}

void attach(ParentActivity activity) {
this.activity=activity;
}
}


On Tue, Oct 4, 2011 at 12:18 AM, TreKing <treking...@gmail.com> wrote:

> On Mon, Oct 3, 2011 at 5:28 PM, Studio LFP <studio....@gmail.com> wrote:
>
>> When this happens, you need to save off the position in your AsyncTask and
>> restart it back when the activity gets restarted.
>
>
> The OP is using getLastNonConfigurationInstance(), which would indicate
> he's keeping the same AsyncTask instance across the application restart, so
> he wouldn't have to restart the AsyncTask.
>
> 2011/10/3 João Rossa <joao.ro...@gmail.com>
>
>> Well when i rotate, either while the thread is started or after the screen
>> data is refreshed it goes back to the fields having not been filled. but the
>> thread does run because if i dont rotate the UI views are filled with the
>> content i fetch from the server.
>
>
> Looks like you AsyncTask is an inner-class of your Activity, which means
> that when you start it, it has an implicit reference to the Activity that
> started it. When you rotate the device, that Activity is destroyed but your
> AsyncTask is still holding on to it, so when you do findViewById() in your
> Runnable, you're acting on the old instance that is no longer visible.
>
> One thing you can do is make the AsyncTask *not* an inner-class and give it
> an *explicit* reference to the Activity it's working on, then reset that
> instance to the new Activity once your activity is restarted.
>
> Or something like that.
>
>
> -------------------------------------------------------------------------------------------------
> TreKing <http://sites.google.com/site/rezmobileapps/treking> - Chicago
> transit tracking app for Android-powered devices
>
>  --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to