4

为什么事件没有被订阅,也onMyEvent没有被调用。相关代码如下。Otto 在我的使用中正常工作,但以下场景涉及从回调处理程序发布事件(这是涉及 http 调用的代码的简化)。不确定这与它有什么关系。

我使用Otto(基于 Guava 事件总线)和Dagger(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();
        }
    }
}

基本片段

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);
    }

}

我的片段

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);
    }
}

我的事件

package com.example.ottocb;

public class MyEvent {
}

主要的.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>

我的片段.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>
4

1 回答 1

15

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

 bus.register(this); 
于 2013-02-01T14:20:33.277 回答