【问题标题】:How to use EventBus library in android如何在 Android 中使用 EventBus 库
【发布时间】:2016-04-16 08:40:27
【问题描述】:

我想为一个站点开发 android 应用程序,在这个应用程序中我想使用 oKHttp v3EventBus v3。事件总线库源链接:LINK.
我写了下面的代码,但是在运行应用程序时,显示 FC 错误!
okHttp_Page(main activity) 代码:

public class okHTTP_Page extends AppCompatActivity {

    private RecyclerView recycler;
    private okHTTP_adapter adaper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ok_http__page);
        EventBus.getDefault().register(this);

        recycler = (RecyclerView) findViewById(R.id.okHTTP_recycler);
        recycler.setHasFixedSize(true);
        recycler.setLayoutManager(new LinearLayoutManager(this));

        okHTTP_info info = new okHTTP_info();
        info.getOkHTTP_info(this);

        adaper = new okHTTP_adapter(this);
        recycler.setAdapter(adaper);

    }
}

okHttp_info(AsyncTask 类)代码:

public class okHTTP_info {
    private Context mContext;

    public void getOkHTTP_info(Context context) {
        mContext = context;
        new getInfo().execute(serverIP.getIP());
    }

    private class getInfo extends AsyncTask<String, Void, String> {
        EventBus bus = EventBus.getDefault();
        private String ou_response;
        private List<okHTTP_dataProvider> infoModels;

        @Override
        protected void onPreExecute() {
            CustomProcessDialog.createAndShow(mContext);
            infoModels = new ArrayList<>();
        }

        @Override
        protected String doInBackground(String... params) {
            OkHttpClient client = new OkHttpClient();

            RequestBody requestBody = new MultipartBody.Builder()
                    .addFormDataPart("test", "2")
                    .addFormDataPart("posts", params[0])
                    .build();

            Request request = new Request.Builder()
                    .url(serverIP.getIP())
                    .post(requestBody)
                    .build();

            Response response;
            try {
                response = client.newCall(request).execute();
                ou_response = response.body().string();
                response.body().close();
                if (ou_response != null) {
                    try {
                        JSONObject postObj = new JSONObject(ou_response);
                        JSONArray postsArray = postObj.getJSONArray("posts");
                        infoModels = new ArrayList<>();

                        for (int i = 0; i < postsArray.length(); i++) {
                            JSONObject postObject = postsArray.getJSONObject(i);
                            int id = postObject.getInt("id");
                            String title = postObject.getString("title");
                            Log.d("Data", "Post id: " + id);
                            Log.d("Data", "Post title: " + title);

                            //Use the title and id as per your requirement
                            infoModels.add(new okHTTP_dataProvider(
                                    postObject.getString("title"),
                                    postObject.getInt("id")));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return ou_response;
        }

        @Override
        protected void onPostExecute(String result) {
            CustomProcessDialog.dissmis();
            if (result != null) {
                bus.post(infoModels);
            }
        }
    }
}

LogCat 错误:

04-16 16:04:34.780 20445-20445/com.tellfa.okhttpproject E/AndroidRuntime: 致命异常: main java.lang.RuntimeException: 无法开始活动 组件信息{com.tellfa.okhttpproject/com.tellfa.okhttpproject.Activities.okHTTP_Page}: org.greenrobot.eventbus.EventBusException:订阅者类 com.tellfa.okhttpproject.Activities.okHTTP_Page 及其超类 没有带有 @Subscribe 注释的公共方法 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2204) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5069) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 在 dalvik.system.NativeStart.main(Native Method) 原因: org.greenrobot.eventbus.EventBusException:订阅者类 com.tellfa.okhttpproject.Activities.okHTTP_Page 及其超类 没有带有 @Subscribe 注释的公共方法 org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:67) 在 org.greenrobot.eventbus.EventBus.register(EventBus.java:136) 在 com.tellfa.okhttpproject.Activities.okHTTP_Page.onCreate(okHTTP_Page.java:23) 在 android.app.Activity.performCreate(Activity.java:5104) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1092) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 在 android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5069) 在 java.lang.reflect.Method.invokeNative(Native Method) 位于 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) dalvik.system.NativeStart.main(Native Method)

 

【问题讨论】:

  • 看logcat,ts超类在@Subscribe注解处没有公共方法你显然没有阅读EventBus的文档,你需要添加注解到您的活动。

标签: android event-bus


【解决方案1】:

您需要添加一个带有@Subscribe 注释的方法。该方法还需要采用一个参数,即您要发布的类型。所以把这个添加到你的AppCompatActivity

@Subscribe
public void subscribeMethod(List infoModels) {
    // Do stuff...
}

另外我想建议不要只发布 List 对象。为此创建一个包含 List 的事件类,这样如果您还需要发布其他 List,您的代码看起来更具可读性。

public static class InfoModelsEvent {
    private List infoModels = new ArrayList<>();
    public InfoModelsEvent(List infomodels) {
        this.infoModels = infoModels;
    }
    // Getter here...
}

然后你的AppCompatActivity 中的方法看起来像:

@Subscribe
public void subscribeMethod(InfoModelsEvent infoModelsEvent) {
    // Do stuff...
}

在您的 AsyncTask 中,您可以这样发布:

bus.post(new InfoModelsEvent(infoModels));

这可以防止您在错误地发布其他 List 对象时遇到麻烦。 :)

【讨论】:

  • 谢谢你,但我是业余爱好者。你能帮我上面的代码吗?请 。我真的需要这个教程
  • 嘿,我刚刚解释了你的代码中的问题。只需将我告诉您的第一个方法添加到 AppCompatActivity。
【解决方案2】:

你只需要在你的活动(okHTTP_Page)中添加onEvent方法和@Subscribe注解

@Subscribe
public void onEvent(List<okHTTP_dataProvider> infoModels) {

};

【讨论】:

    【解决方案3】:

    你需要在onEventMainThread()方法中添加@Subscribe注解,像这样

    @Subscribe
    public void onEventMainThread(){
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多