Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复Android中没有@Subscribe注释的公共方法的超类_Android_Android Fragments_Android Asynctask - Fatal编程技术网

如何修复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 { *; }