如何在 android 中使用 EventBus 库
How to use EventBus library in android
我想为一个站点开发 android 应用程序,在此应用程序中我想使用 oKHttp v3
和 EventBus v3
。事件总线库源 link : 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 class) 代码:
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: FATAL EXCEPTION: main java.lang.RuntimeException:
Unable to start activity
ComponentInfo{com.tellfa.okhttpproject/com.tellfa.okhttpproject.Activities.okHTTP_Page}:
org.greenrobot.eventbus.EventBusException: Subscriber class
com.tellfa.okhttpproject.Activities.okHTTP_Page and its super classes
have no public methods with the @Subscribe annotation at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2204)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254)
at android.app.ActivityThread.access0(ActivityThread.java:141) at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99) at
android.os.Looper.loop(Looper.java:137) at
android.app.ActivityThread.main(ActivityThread.java:5069) at
java.lang.reflect.Method.invokeNative(Native Method) at
java.lang.reflect.Method.invoke(Method.java:511) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at
dalvik.system.NativeStart.main(Native Method) Caused by:
org.greenrobot.eventbus.EventBusException: Subscriber class
com.tellfa.okhttpproject.Activities.okHTTP_Page and its super classes
have no public methods with the @Subscribe annotation at
org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:67)
at org.greenrobot.eventbus.EventBus.register(EventBus.java:136) at
com.tellfa.okhttpproject.Activities.okHTTP_Page.onCreate(okHTTP_Page.java:23)
at android.app.Activity.performCreate(Activity.java:5104) at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1092)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254)
at android.app.ActivityThread.access0(ActivityThread.java:141) at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99) at
android.os.Looper.loop(Looper.java:137) at
android.app.ActivityThread.main(ActivityThread.java:5069) at
java.lang.reflect.Method.invokeNative(Native Method) at
java.lang.reflect.Method.invoke(Method.java:511) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at
dalvik.system.NativeStart.main(Native Method)
您需要添加一个用@Subscribe 注释的方法。该方法还需要采用一个参数,即您正在 posting 的类型。所以将此添加到您的 AppCompatActivity
:
@Subscribe
public void subscribeMethod(List infoModels) {
// Do stuff...
}
此外,我不仅要推荐 post List 对象。为此创建一个事件 class 来包装列表,这样如果您也需要 post 其他列表,您的代码看起来更具可读性。
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 中,您可以这样 posting:
bus.post(new InfoModelsEvent(infoModels));
这可以防止您在误 post 其他 List 对象时遇到麻烦。 :)
你只需要在你的 activity(okHTTP_Page) 中添加 onEvent
方法和 @Subscribe
注释
@Subscribe
public void onEvent(List<okHTTP_dataProvider> infoModels) {
};
你需要在 onEventMainThread() 方法中添加 @Subscribe 注解,像这样
@Subscribe
public void onEventMainThread(){
}
我想为一个站点开发 android 应用程序,在此应用程序中我想使用 oKHttp v3
和 EventBus v3
。事件总线库源 link : 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 class) 代码:
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: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tellfa.okhttpproject/com.tellfa.okhttpproject.Activities.okHTTP_Page}: org.greenrobot.eventbus.EventBusException: Subscriber class com.tellfa.okhttpproject.Activities.okHTTP_Page and its super classes have no public methods with the @Subscribe annotation at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2204) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254) at android.app.ActivityThread.access0(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5069) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.tellfa.okhttpproject.Activities.okHTTP_Page and its super classes have no public methods with the @Subscribe annotation at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:67) at org.greenrobot.eventbus.EventBus.register(EventBus.java:136) at com.tellfa.okhttpproject.Activities.okHTTP_Page.onCreate(okHTTP_Page.java:23) at android.app.Activity.performCreate(Activity.java:5104) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1092) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254) at android.app.ActivityThread.access0(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5069) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)
您需要添加一个用@Subscribe 注释的方法。该方法还需要采用一个参数,即您正在 posting 的类型。所以将此添加到您的 AppCompatActivity
:
@Subscribe
public void subscribeMethod(List infoModels) {
// Do stuff...
}
此外,我不仅要推荐 post List 对象。为此创建一个事件 class 来包装列表,这样如果您也需要 post 其他列表,您的代码看起来更具可读性。
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 中,您可以这样 posting:
bus.post(new InfoModelsEvent(infoModels));
这可以防止您在误 post 其他 List 对象时遇到麻烦。 :)
你只需要在你的 activity(okHTTP_Page) 中添加 onEvent
方法和 @Subscribe
注释
@Subscribe
public void onEvent(List<okHTTP_dataProvider> infoModels) {
};
你需要在 onEventMainThread() 方法中添加 @Subscribe 注解,像这样
@Subscribe
public void onEventMainThread(){
}