I am creating an Activity
which communicates with a Service
to download some data from internet via POST
method. To do this, I use Messenger
. Here is my code to make it clearer for you:
My onCreated()
method:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_comments);
CommentsHandler commentsHandler = new CommentsHandler(this, savedInstanceState);
Messenger messenger = new Messenger(commentsHandler);
Intent serviceIntent = new Intent(this, WindowService.class);
serviceIntent.putExtra("messenger", messenger);
serviceIntent.putExtra("state", 888);
serviceIntent.putExtra("number", getIntent().getStringExtra("number"));
startService(serviceIntent);
}
The code in my Service
's thread to post the result data to the Activity
via the Messenger
object:
/** ... **/
Messenger messenger = intent.getParcelableExtra("messenger");
/** ... **/
Message resultMsg = this.obtainMessage();
resultMsg.obj = jParser.getArrayList(); //This is an ArrayList of my downloaded data.
messenger.send(resultMsg);
The code in the Activity
to handle the Message
from the Service
:
public static class CommentsHandler extends Handler {
Bundle mSavedInstanceState;
ActionBarActivity activity;
public CommentsHandler(Activity a, Bundle savedInstanceState) {
activity = (ActionBarActivity) a;
mSavedInstanceState = savedInstanceState;
}
@Override
public void handleMessage(Message msg) {
comments = (ArrayList<HashMap<String, String>>) msg.obj;
if (mSavedInstanceState == null && msg.arg1 != 793) {
activity.getSupportFragmentManager().beginTransaction()
.add(R.id.container, new CommentsFragment()).commit();
} else if (msg.arg1 == 793) { //793 is my preferred code to determine
//if the internet connection could not be
//established when the Service was trying
//to download the data.
activity.finish();
}
}
}
The problem is: if I open the Activity
and close it before the data is downloaded, this code .add(R.id.container, new CommentsFragment()).commit();
gives me the error Can not perform this action after onSaveInstanceState
, because this code only gets executed after the data in my Service
is processed and sent via the Messenger
object, but at that time the Activity
is already closed by the user so the Fragment
cannot be added. How to solve this issue? How to check if the Activity
is not closed/being closed before adding the Fragment
? Or, better, how to stop the thread in which that code is running on Activity
's onDestroy()
method so it doesn't get executed if the Activity
is closed? Thanks in advance!