我正在进行改造,以便从片段中检索服务器中的数据。但是应用程序有时会在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) {
}
});
}
}
答案 0 :(得分:0)
使用片段进行任何线程化工作时,应始终在对响应进行任何处理之前检查片段是否已添加。如果网络连接很慢,则如果用户更改了屏幕并且未返回呼叫,则可以关闭片段。
您只需要在适配器更新周围包装注释掉的if语句。
setUp(scenorio.inject(atOnceUsers(NO_OF_USERS)));
另外,作为一般规则,在视图片段中进行网络操作可能不是最好的主意。您可以查看为您处理生命周期更改的加载器,或使用保留的片段。