Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当我在选项卡之间快速移动并快速使用ViewPager时,它会崩溃_Android_Android Fragments - Fatal编程技术网

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之前,请检查片段是否正确
  • 不要让你的碎片被破坏,你可以使用
根据你的情况,你可以