Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

handleWindowVisibility: no activity for token android.os.BinderProxy

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);
    }
}
like image 209
Massoud Avatar asked Sep 09 '19 05:09

Massoud


Video Answer


4 Answers

I Don't know Why and How but what i did is I just build > Rebuilt Project then after it rebuilt, I just File > Invalidate Caches / Restart

and then my activity was working perfectly...!

like image 123
Rajat Palankar Avatar answered Oct 05 '22 07:10

Rajat Palankar


In some cases, I've found that using onCreate with a persistentState parameter can cause the issue:

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
    }

Changing the onCreate to only use the savedInstanceState parameter fixes the issue:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
like image 24
vkataria Avatar answered Oct 05 '22 07:10

vkataria


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.

like image 43
Hamid Mir Avatar answered Oct 05 '22 07:10

Hamid Mir


In my case, This occurred when i was trying to pass a really long JSON string through intent extras. From what I can infer , passing a really large value through the extra bundle might lead to memory issues when starting the new intent. Try using shared preferences or serializable objects to share large stuff between activities

Hope that helped!

like image 40
Athresh Kiran Avatar answered Oct 05 '22 07:10

Athresh Kiran