2016-04-16 3 views
-1

Я хочу разработать приложение для Android для одного сайта, в этом приложении я хочу использовать oKHttp v3 и EventBus v3. библиотека источника событийbusbus: LINK.
Я пишу ниже коды, но при запуске приложения покажите мне ошибку FC!
okHttp_Page (основная активность) коды:Как использовать библиотеку EventBus в android

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) коды:

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 Х/AndroidRuntime: неустранимое: Основная java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {com.tellfa.okhttpproject/com.tellfa.okhttpproject.Activities.okHTTP_Page}: org.greenrobot.eventbus.EventBusException: Абонент класс com.tellfa.okhttpproject.Activities.okHTTP_Page и его супер-классы не имеют общих методов с аннотацией @Subscribe в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2204) на android.app.ActivityThread. handleLaunchActivity (ActivityThread.java:2254) at android.app.ActivityThread.access $ 600 (ActivityThread.java:141) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java : 1234) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:137) на android.app.ActivityThread.main (ActivityThread.java:5069) в java.lang.reflect.Method.invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:511) в 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 (родной метод) Вызвано: org.greenrobot.eventbus.EventBusException : Класс подписчика com.tellfa.okhttpproject.Activities.okHTTP_Page и его суперклассы не имеют общедоступных методов с @Subs cribe аннотацию на org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods (SubscriberMethodFinder.java:67) в org.greenrobot.eventbus.EventBus.register (EventBus.java:136) при com.tellfa.okhttpproject.Activities.okHTTP_Page. OnCreate (okHTTP_Page.java:23) на android.app.Activity.performCreate (Activity.java:5104) при android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1092) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2148) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2254) в android.app.ActivityThread.access $ 600 (ActivityThread.java:141) при android.app.Activ ityThread $ H.handleMessage (ActivityThread.java:1234) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:137) на android.app. ActivityThread.main (ActivityThread.java:5069) в java.lang.reflect.Method.invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:511) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) на dalvik.system.NativeStart.main (родной метод)

+1

Глядя на логарифм, * ts супер классы не имеют общедоступных методов с аннотацией @Subscribe на * Вы, очевидно, не читали документацию для события Автобус, вы должны добавить аннотацию к своей деятельности. – t0mm13b

ответ

1

вам просто нужно добавить onEvent метод в деятельности (okHTTP_Page) с @Subscribe аннотацию

@Subscribe 
public void onEvent(List<okHTTP_dataProvider> infoModels) { 

}; 
3

Вам нужно добавить один mehtod который аннотированный с @Subscribe. Этот метод также должен принимать один параметр, который является типом, который вы публикуете. Так что добавьте это к вашему AppCompatActivity:

@Subscribe 
public void subscribeMethod(List infoModels) { 
    // Do stuff... 
} 

Кроме того, я хотел бы рекомендовать не только опубликовать список объектов. Создайте класс событий для этого, который обертывает список, чтобы ваш код выглядел более читаемым, если вам нужно также публиковать другие списки.

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 вы делаете проводку, как это:

bus.post(new InfoModelsEvent(infoModels)); 

Это предотвращает попадание в неприятности при ошибочном размещении других объектов List. :)

+0

Спасибо, человек, но я любитель. вы можете помочь мне с моим кодом? Пожалуйста . Мне действительно нужен этот урок – FeedBack

+0

Эй, я только что объяснил, что ваша проблема в вашем коде. Просто добавьте этот первый метод, который я сказал вам в AppCompatActivity. – vilpe89

0

вам нужно добавить @Subscribe аннотаций в onEventMainThread() метод, как это

@Subscribe 
public void onEventMainThread(){ 

}