事件总线订阅问题(Otto - Guava事件总线)

4
为什么事件没有被订阅,onMyEvent 没有被调用。相关代码如下。 我的使用中Otto正常工作,但以下情况涉及从回调处理程序(这是涉及http调用的代码简化)发布事件。不确定这是否与此有关。
我使用基于Guava事件总线的OttoDagger(Guice)。希望Java专家也能看到我如何注入和使用下面的总线的任何问题。

应用程序(模块注册)

package com.example.ottocb;

import android.app.Application;
import android.content.Context;
import com.squareup.otto.Bus;
import dagger.Module;
import dagger.ObjectGraph;
import dagger.Provides;

import javax.inject.Singleton;

public class MyApplication extends Application {
    private ObjectGraph objectGraph;

    @Override
    public void onCreate() {
        super.onCreate();
        objectGraph = ObjectGraph.create(new MyModule(this));
    }

    public ObjectGraph objectGraph() {
        return objectGraph;
    }

    public void inject(Object object) {
        objectGraph.inject(object);
    }

    @Module(entryPoints = {Bus.class, MyActivity.class,
            MyFragment.class
    })
    static class MyModule {
        private final Context appContext;

        MyModule(Context appContext) {
            this.appContext = appContext;
        }

        @Provides
        @Singleton
        Bus provideBus() {
            return new Bus();
        }
    }
}

BaseFragment

package com.example.ottocb;

import android.app.Fragment;
import android.os.Bundle;

public class BaseFragment  extends Fragment {
    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);

        ((MyApplication) getActivity()
                .getApplication())
                .inject(this);
    }

}

MyFragment

package com.example.ottocb;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;

import javax.inject.Inject;

public class MyFragment extends BaseFragment  {
    private static final String TAG = MyFragment.class.getName();

    @Inject
    Bus bus;

    Button btn;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.myfragment, container,
                false);
        btn = (Button) view.findViewById(R.id.btn);
        btn.setOnClickListener(btnOnClick);

        return view;
    }

    Button.OnClickListener btnOnClick = new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.i(TAG, "onClick");
            MyCB cb = new MyCB();
            cb.success();
        }
    };

    private class MyCB  {
        public void success() {
            Log.i(TAG, "SUCCESS " );

                bus.post(new MyEvent());

        }

        public void failure() {
            Log.e(TAG, "Error");

        }
    }

    @Subscribe
    public void onMyEvent(MyEvent event) {
        Log.i(TAG, "***** onMyEvent ********");
        Toast.makeText(getActivity(), "***** RECEIVED EVENT *****", Toast.LENGTH_SHORT).show();
    }
}

我的活动

package com.example.ottocb;

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

MyEvent

package com.example.ottocb;

public class MyEvent {
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent" android:layout_height="match_parent">
    <fragment class="com.example.ottocb.MyFragment"
              android:id="@+id/myfragment"
              android:layout_width="match_parent" android:layout_height="match_parent" />
</FrameLayout>

myfragment.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Post" />


</LinearLayout>

嗯,Dagger和Guice是完全不同的东西。 - Louis Wasserman
1个回答

15

为了接收事件,类实例需要在总线上进行注册。

 bus.register(this); 

1
^在onCreate()方法中注册,然后在onDestroy()方法中取消注册。 - Tushar Gogna
我的问题完全一样。 - Alyoshak

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