handleWindowVisibility:令牌android.os.BinderProxy没有活动

时间:2019-09-09 05:24:41

标签: android

我有一个登录屏幕,成功登录后,它完成并显示另一个包含有关用户信息的页面。
我读了关于this post以及this post的信息。
我还阅读了很多有关如何扩展Application类的信息,但仍然无法运行此代码。
在下面,您可以找到我的代码,我还将解释错误。

这就是我用Volley调用AsyncTask的方式:
错误就像no activity for token android.os.BinderProxy,当我打电话给startActivity(intent);时就会出现。
我知道此错误是因为活动被杀死,Volley响应后的AsyncTask想使用被杀死的上下文,但我不知道如何解决它。

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) {

          }
});

我的界面如下:
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);
    }
}

4 个答案:

答案 0 :(得分:5)

在某些情况下,我发现将 onCreate persistentState 参数一起使用会导致此问题:

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

更改 onCreate 仅使用 savedInstanceState 参数可解决此问题:

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

答案 1 :(得分:2)

此代码似乎正确,但是我唯一的怀疑是,当您想在wrapper.ntservice.interactive=true中打开新活动时,会发生错误。
因此,检查下一个激发的名为startActivity(intent)的类,看看它是否也从SelfieCapture.class扩展。
还要考虑一下,当您想要获取MyBaseActivity时,如果将其放在currentActivity中,则会得到onCreate。有关更多信息,请参阅 Understand the Activity Lifecycle

答案 2 :(得分:1)

我不知道为什么和如何,但我所做的只是 build > Rebuilt Project 然后在它重建之后,我只是 File > Invalidate Caches / Restart

然后我的活动运行良好......!

答案 3 :(得分:0)

就我而言,这发生在我试图通过 Intent Extras 传递一个非常长的 JSON 字符串时。 据我所知,在开始新意图时,通过额外的包传递一个非常大的值可能会导致内存问题。 尝试使用共享首选项或可序列化对象在 Activity 之间共享大量内容

希望有所帮助!