I have a Login screen and upon success login, it finishes and shows another page that has information about the user.
I read about this post and also this post.
I also read a lot about how we extend Application class but still it is not possible for me to run this code.
Below you can find my code and I will explain the error also.
This is how I user Volley to call an AsyncTask:
The error is like no activity for token android.os.BinderProxy
and it will come when I call startActivity(intent);
.
I know this error is because the activity is killed and the AsyncTask after Volley response wants to use a killed context but I don't know how to fix it.
Util.request_function(
activity,
MainActivity.user_session,
key_value,
new VolleyCallback() {
@Override
public void onSuccess(JSONObject result, Context context) {
Activity activity =
MyBaseActivity.myCustomApplication.getCurrentActivity();
Intent intent = new Intent(activity, SelfieCapture.class);
startActivity(intent);
finish();
}
@Override
public void onError(String result) {
}
});
I have interfaces as below:
VolleyCallback.java:
public interface VolleyCallback {
void onSuccess(JSONObject result) throws JSONException;
void onError(String result) throws Exception;
}
Util.java
public static void request_function(Context context, CognitoUserSession cognitoUserSession, Map<String, String> key_value, final VolleyCallback callback) {
JSONObject jsonBody = new JSONObject();
CustomJSONObjectRequest postRequest = new CustomJSONObjectRequest(Request.Method.POST,
MainActivity.API_URL,
null,
response -> {
JSONObject jsonObject = (JSONObject) response;
//SoMe Stuff//
callback.onSuccess(null);
}, error -> {
//Log Error//
}){
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public Map<String, String> getHeaders() {
final Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
return headers;
}
@Override
public byte[] getBody() {
return jsonBody.toString().getBytes();
}
};
// Request added to the RequestQueue
VolleyController.getInstance(context).addToRequestQueue(postRequest);
MyCustomApplication.java
public class MyCustomApplication extends Application {
private Activity mCurrentActivity = null;
public void onCreate() {
super.onCreate();
}
public Activity getCurrentActivity() {
return mCurrentActivity;
}
public void setCurrentActivity(Activity mCurrentActivity) {
this.mCurrentActivity = mCurrentActivity;
}
}
MyBaseActivity.java
public class MyBaseActivity extends Activity {
public static MyCustomApplication myCustomApplication;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myCustomApplication = (MyCustomApplication)this.getApplicationContext();
}
protected void onResume() {
super.onResume();
myCustomApplication.setCurrentActivity(this);
}
protected void onPause() {
clearReferences();
super.onPause();
}
protected void onDestroy() {
clearReferences();
super.onDestroy();
}
private void clearReferences(){
Activity currActivity = myCustomApplication.getCurrentActivity();
if (this.equals(currActivity))
myCustomApplication.setCurrentActivity(null);
}
}
This code Seems correct but my only suspicion is that when you want to open the new activity in startActivity(intent)
, the error occurs.
So check the next fired class named SelfieCapture.class
to see whether it extends from MyBaseActivity
also.
Also consider that when you want to get the currentActivity
, if you put it in onCreate
, you will get null
. For more information please refer to Understand the Activity Lifecycle.