首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Android中使用@ super注释修复超类没有公共方法

如何在Android中使用@ super注释修复超类没有公共方法
EN

Stack Overflow用户
提问于 2016-06-07 06:21:10
回答 2查看 8.4K关注 0票数 0

我希望在我的Activity中显示3Activity,并在任何fragments中从json加载数据!我希望将每个json数据显示在一个片段中,但在我的应用程序中显示所有片段中的所有数据!(例如:,我希望将文章数据显示为文章片段,音乐数据显示为音乐片段等等)。

但是,在运行应用程序时,请向我显示以下错误:

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
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;
    }
}

freeData (AsyncTask) :

代码语言:javascript
运行
复制
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();
            }
        }
    }
}

paidData (AsyncTask) :

代码语言:javascript
运行
复制
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();
            }
        }
    }
}

自由片段:

代码语言:javascript
运行
复制
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();
    }
}

paid片段:

代码语言:javascript
运行
复制
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();
    }
}

我怎样才能解决这个问题?谢谢大家<3

EN

回答 2

Stack Overflow用户

发布于 2020-12-23 06:08:20

如果您正在为您的构建使用proguard。确保这些行在android中的proguard配置文件中。(也适用于颤振项目)

代码语言:javascript
运行
复制
   -keepattributes *Annotation*
   -keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
    }
   -keep enum org.greenrobot.eventbus.ThreadMode { *; }
票数 4
EN

Stack Overflow用户

发布于 2019-07-28 09:59:15

我也得到了同样的错误,在深入研究了一段时间后,我发现问题是由于错误的进口造成的。

我使用了进口com.google.common.eventbus.Subscribe;

而不是进口org.greenrobot.eventbus.Subscribe;

希望这对外面的人有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37671878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档