代码之家  ›  专栏  ›  技术社区  ›  FeedBack

如何在android中使用EventBus库

  •  -1
  • FeedBack  · 技术社区  · 10 年前

    我想为一个站点开发android应用程序,在这个应用程序中我想使用 oKHttp v3 EventBus v3 .eventbus库源链接: LINK .
    我写了下面的代码,但当运行应用程序时,请显示FC错误!
    okHttp_Page(主要活动)代码:

    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.okhttp项目 E/AndroidRuntime:致命异常:main java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.tellfa.okhttpproject/com.tellfa.cokhttpproject.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(本机方法)位于 java.lang.reflect.Method.invoke(Method.java:511)位于 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(Zygote Init.java:793) 在com.android.internal.os.ZygoteInit.main(ZygoeInit.java:560) dalvik.system.NativeStart。main(本机方法)原因: org.greenrobot.eventbus。EventBusException:订阅服务器类 com.tellfa.okhttpproject.Activities。okHTTP_Page及其超类 在处没有带有@Subscribe注释的公共方法 org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(Subscriber MethodFiner.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(本机方法)位于 java.lang.reflect.Method.invoke(Method.java:511)位于 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(Zygote Init.java:793) 在com.android.internal.os.ZygoteInit.main(ZygoeInit.java:560) dalvik.system.NativeStart。main(本地方法)

    3 回复  |  直到 10 年前
        1
  •  3
  •   vilpe89    10 年前

    您需要添加一个带有@Subscribe注释的mehtod。该方法还需要接受一个参数,该参数是您要发布的类型。因此,将此添加到您的 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...
    }
    

    然后你的方法 应用CompatActivity 看起来像:

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

    在你的AsyncTask中,你会这样做:

    bus.post(new InfoModelsEvent(infoModels));
    

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

        2
  •  1
  •   Ravi    10 年前

    你只需要添加 onEvent 方法(okHTTP_Page) @Subscribe 注释

    @Subscribe
    public void onEvent(List<okHTTP_dataProvider> infoModels) {
    
    };
    
        3
  •  0
  •   段延锐    9 年前

    你需要添加 @订阅 注释位于 事件主线程() 方法,像这样

    @Subscribe
    public void onEventMainThread(){
    
    }