2016-11-01 3 views
0

Ich arbeite mit Retrofit zum Abrufen von Daten vom Server in Fragmenten. Aber die App manchmal mit dem folgenden Fehler in logcat abgestürzt wird:Fragment wird manchmal während der Umschaltung gelöst

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference 
    at com.adarsh.quoteit.fragment.Frnd$1.onResponse(Frnd.java:60) 
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:66) 
    at android.os.Handler.handleCallback(Handler.java:815) 
    at android.os.Handler.dispatchMessage(Handler.java:104) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5692) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 

in jedem Fragmente aufgrund Das ist die Klasse für fragment..every Fragment arbeitet an demselben Konzept und gleiche Fehler kommen, auf denen die App abgestürzt sind. Mein Fragment Klasse ist wie folgt:

public class Motive extends Fragment { 

    private RecyclerView motiveRecycler; 
    private QuoteAdapter motiveAdapter; 
    private List<QuoteList> qItems; 

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View motive_view = inflater.inflate(R.layout.fragment_motivation, container, false); 
     motiveRecycler = (RecyclerView) motive_view.findViewById(R.id.rv_motiv); 
     motiveRecycler.setLayoutManager(new LinearLayoutManager(getActivity())); 
     loadJSON(); 
     return motive_view; 
    } 

    private void loadJSON() { 
     qItems = new ArrayList<>(); 
     Retrofit retrofit = new Retrofit.Builder().baseUrl("http://velapanti.esy.es") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
     MotiveApi requestInterface = retrofit.create(MotiveApi.class); 
     Call<List<QuoteList>> call = requestInterface.getJSON(); 
     call.enqueue(new Callback<List<QuoteList>>() { 
      @Override 
      public void onResponse(Call<List<QuoteList>> call, Response<List<QuoteList>> response) { 
       qItems = response.body(); 
       /*if(!isAdded()) { 
       Fragment 
       }*/ 
       motiveAdapter = new QuoteAdapter(getActivity().getApplicationContext(), qItems); 
       motiveRecycler.setAdapter(motiveAdapter); 

      } 

      @Override 
      public void onFailure(Call<List<QuoteList>> call, Throwable t) { 

      } 
     }); 
    } 
} 

Antwort

0

Wenn jedes Gewinde Arbeit mit Fragmenten zu tun sollen Sie immer überprüfen, ob das Fragment vor allen Arbeiten mit der Antwort hinzugefügt wird. Wenn die Netzwerkverbindung langsam ist, kann das Fragment geschlossen werden, wenn der Benutzer den Bildschirm geändert hat und der Anruf nicht zurückgegeben wurde.

Sie müssen nur Ihre auskommentierte if-Anweisung um Ihre Adapter-Updates wickeln.

Auch als eine allgemeine Regel, die Ihre Netzwerkoperationen in einem Ansichtsfragment tun, ist möglicherweise nicht die beste Idee. Sie könnten nach Loadern suchen, die Änderungen am Lebenszyklus für Sie vornehmen oder beibehaltene Fragmente verwenden.

Verwandte Themen