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

时间:2016-06-07 06:21:11

标签: android android-fragments android-asynctask

我想在我的onMapReady中显示3 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps2); Firebase.setAndroidContext(this); firebaseRef = new Firebase(FIREBASE_URL); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } // Remove the setUpMapIfNeeded method @Override public void onMapReady(final GoogleMap googleMap) { mMap=googleMap; CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(32.065483, 34.824550)); CameraUpdate zoom = CameraUpdateFactory.zoomTo(10); mMap.moveCamera(center); mMap.animateCamera(zoom); mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { // ... }); // ... } 并在任何fragments中加载来自 json 的数据!我希望将每个 json 数据显示到一个片段中,但在我的应用程序中显示所有片段中的所有数据! 例如:我希望将文章数据显示为文章片段,将音乐数据转换为音乐片段等等 但是在运行应用程序时,请告诉我这个错误:

Activity

MyEvent代码:

fragments

freeData(AsyncTask):

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)

paidData(AsyncTask):

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 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();
            }
        }
    }
}

我该如何解决这个问题?谢谢所有&lt; 3

3 个答案:

答案 0 :(得分:3)

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

   -keepattributes *Annotation*
   -keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
    }
   -keep enum org.greenrobot.eventbus.ThreadMode { *; }

答案 1 :(得分:2)

onEvent方法中删除list参数。而是使用您已经放入事件的列表。要么在你的事件中公开该字段,要么为列表添加一个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;
    }
}
 @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();
        }
    }

答案 2 :(得分:1)

我遇到了同样的错误,在挖掘了一段时间后我发现问题是由于导入错误

我用过 导入com.google.common.eventbus.Subscribe;

而不是 导入org.greenrobot.eventbus.Subscribe;

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