如何修复Android中没有@Subscribe注释的公共方法的超类
我想在我的如何修复Android中没有@Subscribe注释的公共方法的超类,android,android-fragments,android-asynctask,Android,Android Fragments,Android Asynctask,我想在我的活动中显示3个片段,并在任何片段中从json加载数据!我想将每个json数据显示为一个片段,但在我的应用程序中,显示所有片段中的所有数据! 例如:我想将文章数据显示为文章片段,将音乐数据显示为音乐片段等等… 但在运行应用程序时,请显示以下错误: FATAL EXCEPTION: main Process: com.razemovafaghiat.tellfa.android, PID: 1865 org.greenrobot.eventbus.EventBusException: Su
活动中显示3个片段
,并在任何片段中从json加载数据!我想将每个json数据显示为一个片段,但在我的应用程序中,显示所有片段中的所有数据!
例如:我想将文章数据显示为文章片段,将音乐数据显示为音乐片段等等…
但在运行应用程序时,请显示以下错误:
FATAL EXCEPTION: main
Process: com.razemovafaghiat.tellfa.android, PID: 1865
org.greenrobot.eventbus.EventBusException: Subscriber class com.razemovafaghiat.tellfa.android.fragments.free_fragment 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.razemovafaghiat.tellfa.android.fragments.free_fragment.onResume(free_fragment.java:83)
at android.support.v4.app.Fragment.performResume(Fragment.java:2020)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1107)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1177)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1025)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545)
at android.view.View.measure(View.java:17496)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5466)
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:664)
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:731)
at android.view.View.measure(View.java:17496)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1075)
at android.view.View.measure(View.java:17496)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5466)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:17496)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5466)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1438)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:724)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:615)
at android.view.View.measure(View.java:17496)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5466)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.view.View.measure(View.java:17496)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5466)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1438)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:724)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:615)
at android.view.View.measure(View.java:17496)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5466)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2636)
at android.view.View.measure(View.java:17496)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2031)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1193)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1400)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1078)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5875)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityT
06-06 17:23:29.721 1865-3617/com.razemovafaghiat.tellfa.android E/error: org.json.JSONException: Index 1 out of range [0..1)
06-06 17:23:30.350 1865-3755/com.razemovafaghiat.tellfa.android E/error: org.json.JSONException: Index 1 out of range [0..1)
MyEvent代码:
public class MyEvent {
public String fragmentTag ;
private List<DataModel> infoModels = new ArrayList<>();
public MyEvent (String tag,List<DataModel> models){
this.fragmentTag = tag;
this.infoModels = models;
}
}
public class free_fragment extends Fragment {
private RecyclerView mRecyclerView;
private free_recycler_adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private List<DataModel> dataModels = new ArrayList<DataModel>();
private Context context;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_free_layout, container, false);
context = getContext();
/* if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}*/
LoadData();
///----- RecyclerView -----
mRecyclerView = (RecyclerView) view.findViewById(R.id.pdf_RecyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mAdapter = new free_recycler_adapter(context, dataModels);
mRecyclerView.setAdapter(mAdapter);
return view;
}
@Subscribe
public void onEvent(MyEvent event, List<DataModel> mainInfoModels) {
/* if (dataModels.size() > 0) {
dataModels.remove(dataModels.size() - 1);
mAdapter.notifyItemRemoved(dataModels.size());
//mAdapter.setLoaded();
}*/
if (event.fragmentTag.equals("forfragment1")) {
mAdapter.add(mainInfoModels);
mAdapter.notifyDataSetChanged();
}
}
private void LoadData() {
freeDataInfo dataInfo = new freeDataInfo();
// here getMainDataInfo() should return the server response
dataInfo.getFreeDataInfo(context);
}
@Override
public void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
EventBus.getDefault().unregister(this);
super.onPause();
}
}
公共类MyEvent{
公共字符串片段标记;
private List infoModels=new ArrayList();
公共MyEvent(字符串标记,列表模型){
this.fragmentTag=标签;
this.infoModels=模型;
}
}
免费数据(异步任务):
public class freeDataInfo {
private Context mContext;
private String ServerAddress = freeServer_IP.getFreeIP();
public void getFreeDataInfo(Context context) {
mContext = context;
new getInfo().execute(ServerAddress + "limit=10");
}
private class getInfo extends AsyncTask<String, Void, String> {
EventBus bus = EventBus.getDefault();
private String ou_response;
private List<DataModel> infoModels = new ArrayList<>();
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
//CustomProcessDialog.createAndShow(mContext);
dialog = new ProgressDialog(mContext);
this.dialog.setMessage("شکیبا باشید...");
this.dialog.show();
}
@Override
protected String doInBackground(String... params) {
OkHttpClient client = new OkHttpClient();
//String url = (String) params[0];
Request request = new Request.Builder()
.url(ServerAddress + "limit=10")
.cacheControl(CacheControl.FORCE_NETWORK)
.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.optJSONArray("result");
for (int i = 0; i <= postsArray.length(); i++) {
JSONObject postObject = (JSONObject) postsArray.get(i);
int id = postObject.getInt("id");
Log.d("id", String.valueOf(id));
String title = postObject.getString("title");
String description = postObject.getString("description");
String image = postObject.getString("image");
String category = postObject.getString("categoryName");
String date = postObject.getString("publishDate");
Log.d("Data", "Post ID: " + id);
Log.d("Data", "Post title: " + title);
Log.d("Data", "Post image: " + image);
Log.d("Data", "---------------------------------");
//Use the title and id as per your requirement
infoModels.add(new DataModel(id, title, description, category, date, image));
}
} catch (JSONException e) {
e.printStackTrace();
Log.e("error", String.valueOf(e));
}
}
} catch (IOException e) {
e.printStackTrace();
Log.e("error2", String.valueOf(e));
}
return ou_response;
}
@Override
protected void onPostExecute(String result) {
//CustomProcessDialog.dissmis();
//Stop Progress
if (dialog.isShowing()) {
dialog.dismiss();
}
if (result != null) {
bus.post(new MyEvent("forfragment1", infoModels));
} else {
Toast.makeText(mContext, "Empty", Toast.LENGTH_SHORT).show();
}
}
}
}
public class paidDataInfo {
private Context mContext;
private String ServerAddress = paidServer_IP.getPaidIP();
public void getPaidDataInfo(Context context) {
mContext = context;
new getInfo().execute(ServerAddress + "limit=10");
}
private class getInfo extends AsyncTask<String, Void, String> {
EventBus bus = EventBus.getDefault();
private String ou_response;
private List<DataModel> infoModels = new ArrayList<>();
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
//CustomProcessDialog.createAndShow(mContext);
//infoModels = new ArrayList<>();
// Initiate Progress
dialog = new ProgressDialog(mContext);
this.dialog.setMessage("شکیبا باشید...");
this.dialog.show();
}
@Override
protected String doInBackground(String... params) {
OkHttpClient client = new OkHttpClient();
//String url = (String) params[0];
Request request = new Request.Builder()
.url(ServerAddress + "limit=10")
.cacheControl(CacheControl.FORCE_NETWORK)
.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.optJSONArray("result");
infoModels = new ArrayList<>();
for (int i = 0; i <= postsArray.length(); i++) {
JSONObject postObject = (JSONObject) postsArray.get(i);
int id = postObject.getInt("id");
Log.d("id", String.valueOf(id));
String title = postObject.getString("title");
String description = postObject.getString("full_description");
String image = postObject.getString("image");
String category = postObject.getString("categoryName");
String date = postObject.getString("publishDate");
Log.d("Data", "Post ID: " + id);
Log.d("Data", "Post title: " + title);
Log.d("Data", "Post Desc: " + description);
Log.d("Data", "Post image: " + image);
Log.d("Data", "---------------------------------");
//Use the title and id as per your requirement
infoModels.add(new DataModel(id, title, description, category, date, image));
}
} catch (JSONException e) {
e.printStackTrace();
Log.e("error", String.valueOf(e));
}
}
} catch (IOException e) {
e.printStackTrace();
Log.e("error2", String.valueOf(e));
}
return ou_response;
}
@Override
protected void onPostExecute(String result) {
//Stop Progress
if (dialog.isShowing()) {
dialog.dismiss();
}
//CustomProcessDialog.dissmis();
if (result != null) {
bus.post(new MyEvent("forfragment2", infoModels));
} else {
Toast.makeText(mContext, "Empty", Toast.LENGTH_SHORT).show();
}
}
}
}
public class paid_fragment extends Fragment {
private RecyclerView mRecyclerView;
private paid_recycler_adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private List<DataModel> dataModels = new ArrayList<DataModel>();
private Context context;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_paid_layout, container, false);
context = getContext();
/* if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}*/
LoadData();
///----- RecyclerView -----
mRecyclerView = (RecyclerView) view.findViewById(R.id.voice_RecyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mAdapter = new paid_recycler_adapter(context, dataModels);
mRecyclerView.setAdapter(mAdapter);
return view;
}
@Subscribe
public void onEvent(MyEvent event, List<DataModel> mainInfoModels) {
/* if (dataModels.size() > 0) {
dataModels.remove(dataModels.size() - 1);
mAdapter.notifyItemRemoved(dataModels.size());
//mAdapter.setLoaded();
}*/
if (event.fragmentTag.equals("forfragment2")) {
mAdapter.add(mainInfoModels);
mAdapter.notifyDataSetChanged();
}
}
private void LoadData() {
paidDataInfo dataInfo = new paidDataInfo();
// here getMainDataInfo() should return the server response
dataInfo.getPaidDataInfo(context);
}
@Override
public void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
EventBus.getDefault().unregister(this);
super.onPause();
}
}
公共类freeDataInfo{
私有上下文;
私有字符串ServerAddress=freeServer_IP.getFreeIP();
public void getFreeDataInfo(上下文){
mContext=上下文;
新建getInfo().execute(ServerAddress+“limit=10”);
}
私有类getInfo扩展了异步任务{
EventBus=EventBus.getDefault();
私有字符串ou_响应;
private List infoModels=new ArrayList();
私人对话;
@凌驾
受保护的void onPreExecute(){
//CustomProcessDialog.createAndShow(mContext);
dialog=新建ProgressDialog(mContext);
this.dialog.setMessage(“شکیبببب㶎ید…”);
this.dialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
OkHttpClient=新的OkHttpClient();
//字符串url=(字符串)参数[0];
Request Request=newrequest.Builder()
.url(服务器地址+“限制=10”)
.cacheControl(cacheControl.FORCE_网络)
.build();
反应;
试一试{
response=client.newCall(request.execute();
ou_response=response.body().string();
response.body().close();
if(ou_响应!=null){
试一试{
JSONObject postObj=新JSONObject(ou_响应);
JSONArray postsArray=postObj.optJSONArray(“结果”);
对于(int i=0;i 0){
dataModels.remove(dataModels.size()-1);
notifyItemRemoved(dataModels.size());
//mAdapter.setLoaded();
}*/
if(event.fragmentTag.equals(“forfragment2”)){
mAdapter.add(mainformodels);
mAdapter.notifyDataSetChanged();
}
}
私有void LoadData(){
paidDataInfo=新的paidDataInfo();
//此处getMainDataInfo()应返回服务器响应
dataInfo.getPaidDataInfo(上下文);
}
@凌驾
恢复时公开作废(){
super.onResume();
EventBus.getDefault()寄存器(此);
}
@凌驾
公共无效暂停(){
EventBus.getDefault().unregister(此);
super.onPause();
}
}
如何解决此问题?感谢所有从您的onEvent
方法中删除列表参数。改为使用已放入事件中的列表。这需要在事件中公开该字段或为列表添加一个getter
大概是这样的:
public class MyEvent {
public String fragmentTag ;
private List<DataModel> infoModels = new ArrayList();
public MyEvent (String tag,List<DataModel> models){
this.fragmentTag = tag;
this.infoModels = models;
}
public List<DataModel> getInfoModels() {
return infoModels;
}
}
公共类MyEvent{
公共字符串片段标记;
private List infoModels=new ArrayList();
公共MyEvent(字符串标记,列表模型){
this.fragmentTag=标签;
this.infoModels=模型;
}
公共列表getInfoModels(){
返回信息模型;
}
}
@订阅
public void onEvent(MyEvent事件){
List dataModels=event.getInfoModels();
if(dataModels.size()>0){
dataModels.remove(dataModels.size()-1);
notifyItemRemoved(dataModels.size());
//mAdapter.setLoaded();
}
if(event.fragmentTag.equals(“forfragment2”)){
mAdapter.add(mainformodels);
mAdapter.notifyDataSetChanged();
}
}
我也犯了同样的错误,在仔细研究了一段时间后,我发现问题是由于导入错误造成的
我用过
导入com.google.common.eventbus.Subscribe
而不是
导入org.greenrobot.eventbus.Subscribe
希望这将对其他人有所帮助。如果您正在使用proguard进行构建。请确保这些行位于android中的proguard配置文件中。(也适用于Flatter项目)
-keepattributes*注释*
-keepclassmembers类**{
@org.greenrobot.eventbus.Subscribe;
}
-保持枚举org.greenrobot.eventbus.ThreadMode{*;}
检查您是否导入了正确的@Subscribe
注释。可能您的类路径上有多个注释,但导入了一个错误的注释。更正:on事件有两个参数。它应该只有事件参数。而不是列表。@Dodge,您能给我发送代码吗?PleaseeEvent总线用于触发事件,而不是发送数据。获取riOneEvent中的列表的dparameters@Mohammad我添加了一个示例。其他片段您必须自己更新。我应该显示此片段上的所有片段数据。但是,当使用默认事件总线代码时,会显示所有片段中的任何片段!谢谢,但是对于public ListgetInfoModels(){return infoModels;}
向我显示错误!请查看此图像以了解错误:请帮助我,我真的需要它。我修复了线路。stackoverflow确实损坏了东西谢谢我亲爱的朋友
@Subscribe
public void onEvent(MyEvent event) {
List<DataModel> dataModels = event.getInfoModels();
if (dataModels.size() > 0) {
dataModels.remove(dataModels.size() - 1);
mAdapter.notifyItemRemoved(dataModels.size());
//mAdapter.setLoaded();
}
if (event.fragmentTag.equals("forfragment2")) {
mAdapter.add(mainInfoModels);
mAdapter.notifyDataSetChanged();
}
}
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }