Android 当我在选项卡之间快速移动并快速使用ViewPager时,它会崩溃
我在应用程序中使用Android 当我在选项卡之间快速移动并快速使用ViewPager时,它会崩溃,android,android-fragments,Android,Android Fragments,我在应用程序中使用ViewPager和Tabs。当我测试应用程序并在选项卡之间快速移动时,它会崩溃。我有一个片段和3个选项卡,每个选项卡中片段的内容都会发生变化。内容是使用Reformation 2从API获取的数据。我还使用FragmentStatePagerAdapter 这是我的日志 java.lang.IllegalStateException: Fragment MainFragment{423155d0} not attached to Activity
ViewPager
和Tabs
。当我测试应用程序并在选项卡之间快速移动时,它会崩溃。我有一个片段
和3个选项卡
,每个选项卡中片段
的内容都会发生变化。内容是使用Reformation 2
从API
获取的数据。我还使用FragmentStatePagerAdapter
这是我的日志
java.lang.IllegalStateException: Fragment MainFragment{423155d0} not attached to Activity
at android.support.v4.app.Fragment.getResources(Fragment.java:715)
at com.webstore.footballscores.Fragments.MainFragment$4.onResponse(MainFragment.java:393)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5641)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1288)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104)
at dalvik.system.NativeStart.main(Native Method)
这一行中有一个错误
res = getResources();
还有其余的代码
connection.enqueue(new Callback<List<FixturesObject>>() {
@Override
public void onResponse(Call<List<FixturesObject>> call, Response<List<FixturesObject>> response) {
if (!response.isSuccessful()) {
progressDoalog.dismiss();
Toast.makeText(getActivity(), "Something went wrong , Please refresh again", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
}, 4000);
} else if (response.isSuccessful()) {
i=1;
imageView.setVisibility(View.GONE);
progressDoalog.dismiss();
if (isAdded()) {
res = getResources();
String[] teamEngList = res.getStringArray(R.array.team_english);
String[] teamArabList = res.getStringArray(R.array.team_arabic);
}
if (response.body().get(i).getLeagueId().equals("109")) {
for (int j = 0; j < teamEngList.length; j++) {
if (teamEngList[j].equals(response.body().get(i).getMatchAwayteamName())) {
response.body().get(i).setMatchAwayteamName(teamArabList[j]);
} else if (teamEngList[j].equals(response.body().get(i).getMatchHometeamName())) {
response.body().get(i).setMatchHometeamName(teamArabList[j]);
}
}
spainObject.add(response.body().get(i));
listDataChild.put(listDataHeader.get(listDataHeader.size() - 1), spainObject);
}
adapter.clearData();
adapter.addData(listDataHeader, listDataChild);
}
connection.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
如果(!response.issusccessful()){
progressDoalog.disclose();
Toast.makeText(getActivity(),“出现问题,请再次刷新”,Toast.LENGTH\u SHORT.show();
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
swipeRefreshLayout.setRefreshing(false);
}
}, 4000);
}else if(response.issusccessful()){
i=1;
设置可见性(View.GONE);
progressDoalog.disclose();
if(isAdded()){
res=getResources();
String[]teamenglisht=res.getStringArray(R.array.team\u english);
String[]teamArabList=res.getStringArray(R.array.team_阿拉伯语);
}
if(response.body().get(i).getLeagueId()等于(“109”)){
对于(int j=0;j
如何修复此错误。
感谢您在滑动ViewPager时为可见页面创建片段并销毁不可见页面。您的网络请求独立于该过程。当网络请求完成并销毁相应片段时,您正在尝试调用getResources()
但是这个调用需要有一个上下文。如果一个片段已经被销毁,那么它就不再有上下文,因此,你会得到一个崩溃
要解决此问题,您需要确保在进行该调用之前上下文可用。请尝试以下操作:
if (!isAdded()) return;
res = getResources();
//...
一些文档:当您滑动查看页面时,会为可见页面创建片段,并销毁不可见页面。您的网络请求独立于该过程。当网络请求完成并销毁相应片段时,您会尝试调用getResources()
但是这个调用需要有一个上下文。如果一个片段已经被销毁,那么它就不再有上下文,因此,你会得到一个崩溃
要解决此问题,您需要确保在进行该调用之前上下文可用。请尝试以下操作:
if (!isAdded()) return;
res = getResources();
//...
一些文档:当请求完成时,片段已经被分离。例如,您可以调用,而不是等待响应然后将其丢弃
@Override
public void onDestroy() {
connection.cancel();
super.onDestroy();
}
请注意,回调仍将被触发,但在请求完成时,使用onFailure()
而不是onResponse()
,片段已被分离。例如,您可以调用,而不是等待响应然后将其丢弃
@Override
public void onDestroy() {
connection.cancel();
super.onDestroy();
}
请注意,回调仍将被触发,但会使用onFailure()
而不是onResponse()
触发异常的原因
您正在使用FragmentStatePagerAdapter
因此ViewPager
中的Fragment
可以销毁,然后分离()。
在每个片段中
,您运行一个异步任务(使用改型),完成后更新UI。
如果您为之前已销毁的片段更新UI,您将获得异常
解决
有一些方法可以解决你的问题
- 取消接收来自异步请求的回调或取消请求
- 在异步任务完成后更新UI之前,请检查片段是否正确
- 不要让你的碎片被破坏,你可以使用
根据您的情况,您可以通过3种方式选择1获得异常的原因
您正在使用FragmentStatePagerAdapter
因此ViewPager
中的Fragment
可以销毁,然后分离()。
在每个片段中
,您运行一个异步任务(使用改型),完成后更新UI。
如果您为之前已销毁的片段更新UI,您将获得异常
解决
有一些方法可以解决你的问题
- 取消接收来自异步请求的回调或取消请求
- 在异步任务完成后更新UI之前,请检查片段是否正确
- 不要让你的碎片被破坏,你可以使用
根据你的情况,你可以