切换时片段有时会脱离

时间:2016-11-01 12:04:49

标签: android android-fragments

我正在进行改造,以便从片段中检索服务器中的数据。但是应用程序有时会在logcat中遇到以下错误而崩溃:

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)

这是片段的类..每个片段都在处理相同的概念,同一个错误出现在应用程序崩溃的任何片段中。 我的片段类如下:

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) {

            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

使用片段进行任何线程化工作时,应始终在对响应进行任何处理之前检查片段是否已添加。如果网络连接很慢,则如果用户更改了屏幕并且未返回呼叫,则可以关闭片段。

您只需要在适配器更新周围包装注释掉的if语句。


setUp(scenorio.inject(atOnceUsers(NO_OF_USERS)));

另外,作为一般规则,在视图片段中进行网络操作可能不是最好的主意。您可以查看为您处理生命周期更改的加载器,或使用保留的片段。