【问题标题】:Using Otto.Bus Post and @subscribe is not being called未调用使用 Otto.Bus Post 和 @subscribe
【发布时间】:2017-05-12 06:36:11
【问题描述】:

我正在尝试让 @Subscribe 从 AsyncTask 回调活动。我已经阅读了 Otto 技术文档,并且还阅读了许多不同的在线文章以及堆栈上的文章,但它们似乎都没有帮助我解决我的问题。

AsynTask 调用完美,并记录在我的日志中,我什至可以从发布请求中获得响应。正如我在其他问题和技术文档中看到的那样,我也在注册 otto 和注销它。

我通过从 SignupActivity 传入适当的参数来执行我的任务:

new SignupTask(SignupActivity.this,
                                (questionPosition + 1),
                                response.getEditText().getText().toString(),
                                FirstName.getEditText().getText().toString(),
                                LastName.getEditText().getText().toString(),
                                Mail.getEditText().getText().toString(),
                                Pass.getEditText().getText().toString(),
                                "0.0.0.0").execute();

我的 SignupTask 然后进行异步调用:

 @Override
public Integer call() throws Exception {
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
    client.getAPIInterface().SignUp(new TaskRequests.SignUpRequest(firstNameString,
            lastNameString,
            email,
            pass,
            pass),new Callback<String>() {
        @Override
        public void success(String msg, Response response) {
            SignupResponse resp = new SignupResponse();
            resp.setMsg(msg);
            OttoBusSingleton.getInstance().post(resp);
        }

现在在 SignupActivity 上,我有一个方法可以通过 @Subscribe 处理 Otto:

@Subscribe
public void onSignUpSuccess(SignupResponse event) {
    loading.dismiss();

    if(!BuildConfig.DEBUG_MODE) {
        Log.i(TAG, "!BuildConfig.DEBUG_MODE : " + AnswersAnalytics.SIGN_UP_PATIENT);
        Answers.getInstance().logCustom(new CustomEvent(AnswersAnalytics.SIGN_UP));
    }

    Toast.makeText(this,
            event.getMsg(),
            Toast.LENGTH_LONG).show();
    this.finish();
}

从这里我试图让 Otto 回调处理 SignupActivity 上的成功,并且在放置断点时它永远不会被命中。

我已确保导入正确,但我似乎无法确定可能的解决方案。

【问题讨论】:

    标签: android android-activity android-asynctask otto


    【解决方案1】:

    为了接收事件,类实例需要向总线注册。

    您需要在您的活动中添加类似以下代码的内容(采用from the sample):

    ...
    @Override 
    protected void onResume() {
    super.onResume();
    
        // Register ourselves so that we can provide the initial value.
        BusProvider.getInstance().register(this);
    }
    
    @Override 
    protected void onPause() {
      super.onPause();
    
      // Always unregister when an object no longer should be on the bus.
      BusProvider.getInstance().unregister(this);
    }
    ...
    

    请注意,您需要尝试在onCreate() 中注册总线并在onDestroy() 中取消注册。这是因为当 Activity 处于非活动状态时,onPause() 将被调用。所以你会不小心取消注册总线。

    【讨论】:

    • 在 onStart 我已经这样注册了:otto.register(this);并做了一些 onDestroy 取消注册
    • 顺便说一句,尝试使用 EventBus 代替 Otto。因为 Otto 已被弃用。
    • 也许你需要使用new Bus(ThreadEnforcer.MAIN);。因为当您从 AsyncTask 发送事件时,该事件驻留在其他线程而不是 UI 线程中。
    • 感谢您指出 Otto 并转移到 BusProvider...这是一个旧代码库,我刚刚进入并且不知道这一点!
    • 很高兴为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2020-11-16
    • 2019-02-16
    • 2021-03-22
    相关资源
    最近更新 更多