Pergunta

Why the event is not subscribed, and onMyEvent not called. Relavent code is below. Otto is working normally in my uses, but below scenario involves posting the event from a callback handler (this is a simplification of code involving http calls). Not sure this has to do anything with it.

I use Otto (Guava event bus based) and Dagger (Guice). Hope Java experts may also be able to see any issue on how I inject and use the bus below.

Application (Module registration)

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

MyActivity

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>
Foi útil?

Solução

In order to receive events, a class instance needs to register with the bus.

 bus.register(this); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top