2016-04-16 7 views
-1

Ich möchte entwickeln Android Appliacation für eine Website, in dieser Anwendung möchte ich oKHttp v3 und EventBus v3 verwenden. Ereignisquellenbibliothek Link: LINK.
Ich schreibe unten Codes, aber wenn Sie Anwendung ausführen, zeigen Sie mir FC Fehler!
okHttp_Page (Hauptaktivität) -Codes:Wie man EventBus Bibliothek in 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 Klasse) -Codes:

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 Fehler:

04-16 16: 04: 34.780 20445-20445/com.tellfa.okhttpproject E/Android Runtime: FATAL AUSNAHME: Haupt java.lang.RuntimeException: Unable Aktivität ComponentInfo {com.tellfa.okhttpproject/com.tellfa.okhttpproject.Activities.okHTTP_Page} starten: org.greenrobot.eventbus.EventBusException: Subscriber Klasse com.tellfa.okhttpproject.Activities.okHTTP_Page und ihre Superklassen mit der @Subscribe Anmerkung an android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2204) bei android.app.ActivityThread keine öffentlichen Methoden. handleLaunchActivity (ActivityThread.java:2254) bei android.app.ActivityThread.access $ 600 (ActivityThread.java:141) um android.app.ActivityThread $ H.handleMessage (ActivityThread.java : 1234) bei android.os.Handler.dispatchMessage (Handler.java:99) um android.os.Looper.loop (Looper.java:137) um android.app.ActivityThread.main (ActivityThread.java:5069) um java.lang.reflect.Method.invokeNative (Native Methode) um java.lang.reflect.Method.invoke (Methode.java:511) um com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:793) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) um dalvik.system.NativeStart.main (systemeigene Methode) verursacht durch: org.greenrobot.eventbus.EventBusException : Subscriber-Klasse com.tellfa.okhttpproject.Activities.okHTTP_Page und seine Super-Klassen haben keine öffentlichen Methoden mit den @Subs cribe Annotation bei org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods (SubscriberMethodFinder.java:67) bei org.greenrobot.eventbus.EventBus.register (EventBus.java:136) bei com.tellfa.okhttpproject.Activities.okHTTP_Page. onCreate (okHTTP_Page.java:23) bei android.app.Activity.performCreate (Activity.java:5104) bei android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1092) bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2148) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2254) bei android.app.ActivityThread.access $ 600 (ActivityThread.java:141) bei android.app.Activ ityThread $ H.handleMessage (ActivityThread.java:1234) bei android.os.Handler.dispatchMessage (Handler.java:99) um android.os.Looper.loop (Looper.java:137) um android.app. ActivityThread.main (ActivityThread.java:5069) um java.lang.reflect.Method.invokeNative (native Methode) um java.lang.reflect.Method.invoke (Method.java:511) um com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:793) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) um dalvik.system.NativeStart.main (native Methode)

+1

Mit Blick auf das Logcat haben * ts Super-Klassen keine öffentlichen Methoden mit der @Subscribe-Annotation an * Sie haben offensichtlich die Dokumentation für das Event nicht gelesen Bus, Sie müssen die Anmerkung zu Ihrer Aktivität hinzufügen. – t0mm13b

Antwort

1

Sie brauchen nur onEvent Methode in Ihrer Aktivität (okHTTP_Page) mit @Subscribe Anmerkung

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

}; 
3

Sie benötigen einen Mehtod hinzuzufügen, die mit @Subscribe kommentiert wird. Diese Methode muss auch einen Parameter annehmen, der von dem Typ ist, den Sie posten. So fügen Sie diese zu Ihrer AppCompatActivity:

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

Auch würde Ich mag nicht nur senden Sie das List-Objekt empfehlen. Erstellen Sie hierfür eine Ereignisklasse, die die Liste umschließt, damit Ihr Code lesbarer aussieht, wenn Sie auch andere Listen veröffentlichen müssen.

public static class InfoModelsEvent { 
    private List infoModels = new ArrayList<>(); 
    public InfoModelsEvent(List infomodels) { 
     this.infoModels = infoModels; 
    } 
    // Getter here... 
} 

Und dann geht das Verfahren in Ihrem AppCompatActivity würde wie folgt aussehen:

@Subscribe 
public void subscribeMethod(InfoModelsEvent infoModelsEvent) { 
    // Do stuff... 
} 

Und in Ihrem AsyncTask Sie den Eintrag wie folgt tun:

bus.post(new InfoModelsEvent(infoModels)); 

Dies verhindert, dass Sie in Schwierigkeiten wenn versehentlich andere List-Objekte gepostet werden. :)

+0

Danke Mann, aber ich bin Amateur. kannst du mir mit meinem obigen Code helfen? Bitte . Ich brauche dieses Tutorial wirklich – FeedBack

+0

Hey, ich habe gerade erklärt, was Ihr Problem in Ihrem Code ist. Fügen Sie einfach die erste Methode, die ich Ihnen genannt habe, der AppCompatActivity hinzu. – vilpe89

0

Sie @Subscribe Anmerkung an onEventMainThread() Methode hinzufügen hinzufügen müssen, wie diese

@Subscribe 
public void onEventMainThread(){ 

}