处理窗口可见性:没有与令牌android.os.BinderProxy关联的活动

17

我有一个登录界面,成功登录后会显示另一个页面,该页面包含用户信息。我阅读了此贴文此贴文,还学习了很多如何扩展Application类的知识,但仍无法运行此代码。以下是我的代码,并解释了错误信息。

我使用Volley调用AsyncTask的方法如下:
当我调用startActivity(intent);时,会出现no activity for token android.os.BinderProxy这样的错误。我知道这个错误是因为活动被销毁,而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);
    }
}
6个回答

9
在某些情况下,我发现使用具有 persistentState 参数的 onCreate 可能会导致问题。
    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
    }

onCreate 方法仅使用 savedInstanceState 参数可解决该问题:

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

6

这段代码看起来没问题,但我唯一怀疑的是当你想要在 startActivity(intent) 中打开新活动时,错误会发生。
所以检查下一个被激活的类名为 SelfieCapture.class 是否也继承自 MyBaseActivity
还需要考虑,当你想要获得当前活动状态currentActivity时,如果将其放在onCreate中,你将得到null。要了解更多信息,请参阅了解活动生命周期


2
我不知道为什么和如何解决,但我只是做了以下步骤:首先构建 > 重新构建项目,然后在重新构建之后,我就 File > 无效缓存 / 重启。

然后我的活动就完美地运行了...!


1
在我的情况下,这发生在我试图通过意图扩展传递一个非常长的JSON字符串时。据我所推断,通过额外捆绑包传递一个非常大的值可能会导致启动新意图时出现内存问题。尝试使用共享首选项或可序列化对象在活动之间共享大型内容。
希望有所帮助!

0
对于我的Flutter应用程序,Firebase需要SHA-1指纹。我之前已经添加过了,但不知何故它被更改了,然后我只是将我的应用程序的新SHA-1指纹添加到Firebase Android应用程序中,然后它就正常工作了。希望能对你有所帮助。

0

我在我的登录活动中遇到了这个错误,因为我忘记打开模拟器的互联网!我打开它就解决了。

我的意思是这个错误:没有为 android.os.BinderProxy 的令牌活动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接