Android Fragment.isAdded()在support-v4:23.4.0中的行为与以前的版本不同

Android Fragment.isAdded()在support-v4:23.4.0中的行为与以前的版本不同,android,android-fragments,android-fragmentactivity,support-v4,Android,Android Fragments,Android Fragmentactivity,Support V4,当我将support-v4版本从23.1.1升级到23.4.0时,我注意到了这个问题:基本上,isAdded()在返回true时总是返回false 我有一个活动(FragmentActivity),它有一个包含片段的ViewPager。每个片段在启动时在onCreate()中启动一个异步任务以下载一些图像;为了提高效率,在回调中,我检查isAdded(),以确保在继续处理之前附加了片段 如果我包括support-v4库的23.1.1版,我的代码将按预期工作。然而,当我更新到23.4.0时,isA

当我将support-v4版本从23.1.1升级到23.4.0时,我注意到了这个问题:基本上,isAdded()在返回true时总是返回false

我有一个活动(FragmentActivity),它有一个包含片段的ViewPager。每个片段在启动时在onCreate()中启动一个异步任务以下载一些图像;为了提高效率,在回调中,我检查isAdded(),以确保在继续处理之前附加了片段

如果我包括support-v4库的23.1.1版,我的代码将按预期工作。然而,当我更新到23.4.0时,isAdded()似乎几乎总是返回false,这甚至不允许当前片段完成异步结果的处理

注意:翻阅相册并不重要——对isAdded()的每个调用似乎都返回false

下面的相关代码(注意:本例简化了一些代码):

//注意FetchableListener实现onFetchableUpdate()
公共类CameraAlbumItemFragment
实现Fetchable.FetchableListener
{
私有静态最终字符串摄影机\u相册\u项目\u片段\u摄影机\u KEY=“摄影机”;
//成员变量
//
@可调零的私人摄像机;
@可为空的私有ArrayList m_imageDownloads;
公共静态CameraAlbumItemFragment newInstance(@NotNull Camera Camera)
{
final CameraAlbumItemFragment=新的CameraAlbumItemFragment();
fragment.setRetainInstance(真);
最终捆绑=新捆绑(1);
捆绑。可打包(相机、相册、物品、碎片、相机、钥匙);
fragment.setArguments(bundle);
返回片段;
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
m_camera=getArguments().getParcelable(相机、相册、项目、片段、相机、键);
//如果图像尚未下载,则启动后台
//任务来检索它们。不太可能,但请确保我们的相机不是空的
//
如果(m_camera!=null&&m_imageDownloads==null)
{
//这将启动一个异步任务,该任务在收到服务器的响应时调用onFetchableUpdate()
m_camera.updateNonCurrentView(getActivity(),this);
}
}
/**片段的用户界面*/
@凌驾
创建视图时的公共视图(@NotNull LAYOUTING充气机,
@可为空的视图组容器,
@可为空的捆绑包savedInstanceState)
{
最终视图=充气机。充气(R.layout.camera\u album\u项目,容器,错误);
//设置图像(如果已下载)
//
//设置“循环图像”按钮的单击侦听器
//这必须在这里完成,而不是在布局中使用android:onClick属性
//文件,因为这是一个片段,而不是一个活动
//
final ImageView cameraImageView=(ImageView)view.findViewById(R.id.camera\u image\u view);
返回视图;
}
/**
*将图像添加到下载的图像列表中。根据显示或隐藏“循环图像”按钮
*检索到的图像数
*
*@param位图由后台进程检索的图像
*/
public void addImage(@null最终位图,@NotNull最终字符串viewName)
{
断言m_imageDownloads!=null;
m_imageDownloads.add(新的CameraViewImageDownloadResult(位图、视图名));
}
@凌驾
public void onFetchableUpdate(@NotNull-Fetchable-Fetchable,@null-Object-data)
{
//*********************************************************
//注意:这里对isAdded()的调用几乎返回false
//每次在support-v4:23.4.0中,但不是在23.1.1中
//**********************************************************
if(fetchable==m_-camera&&isAdded())
{
最终列表cameraViews=m_camera.getViews();
m_imageDownloads=newarraylist(cameraViews.size());
//下载相机图像
for(CameraView CameraView:cameraViews)
{
if(cameraView.isCurrent())
{
最终字符串imageURL=cameraView.getCameraURL();
if(imageURL!=null)
{
新的GetCameraImageAsyncTask(这个,cameraView.getName()).execute(imageURL);
}
其他的
{
Log.e(Log_标记,“+cameraView.getName()没有有效的图像URL”);
addImage(null,cameraView.getName());
}
}
其他的
{
addImage(null,cameraView.getName());
}
}
//我们不再需要维护观测者引用
m_摄像头。拆卸监视器(此);
}
}
/**
*获取用于显示摄影机视图的图像视图
*
*@返回相机图像视图
*/
@可空
private ImageView getCameraImageView()
{
最终视图v=getView();
如果(v!=null)
{
返回(图像视图)v.findViewById(R.id.camera\u image\u view);
}
其他的
{
返回null;
}
}
}
以及它的活动(FragmentActivity),其中包含一个ViewPager

 public class CameraAlbumActivity
    extends FragmentActivity
 {
    // Intent Data Key
    //
    public final static String CAMERA_ALBUM_SELECTED_ID_KEY = "selectedId" ;

     private static final String LOG_TAG = "CameraAlbumActivity" ;

    @Override
    protected void onCreate ( @Nullable Bundle savedInstanceState )
    {
       super.onCreate( savedInstanceState );

       final Intent intent = getIntent();

       final Object sharedData = SharedDataWrapper.getInstance().getData();

        CameraCollection cameraCollection ;

        if ( sharedData != null && sharedData instanceof CameraCollection )
        {
            cameraCollection = ( CameraCollection ) sharedData;
        }
        else
        {
            // just create an empty collection
            cameraCollection = new CameraCollection() ;
        }

        // Load view
        setContentView( R.layout.album );

        // Get references to buttons
        //
        m_previousButton = (ImageView)findViewById( R.id.album_previous_btn );
        m_nextButton = (ImageView)findViewById( R.id.album_next_btn );

        // Configure view pager
        //
        m_viewPager = (ViewPager)findViewById( R.id.album_view_pager );

       final CameraAlbumPagerAdapter adapter = new CameraAlbumPagerAdapter( getSupportFragmentManager(), cameraCollection );
       m_viewPager.setAdapter( adapter );
       m_viewPager.addOnPageChangeListener( new OnCyclingContentAlbumViewScrollListener( this, adapter ) );

       // Set the selected item
       int selectedId = intent.getIntExtra( CAMERA_ALBUM_SELECTED_ID_KEY, -1 );
       if( selectedId == -1 )
       {
          return;
       }

       List<Camera> models = cameraCollection.getAllModels();

       for ( int i = 0 ; i < models.size() ; i++ )
       {
           Camera camera = models.get( i );
           if ( selectedId == camera.getId() )
           {
               m_viewPager.setCurrentItem( i, false );
               break;
           }
       }
    }

     /**
      * OnPageChangeListeners should be removed to prevent memory leaks
      */
     @Override
     public void onDestroy()
     {
         m_viewPager.clearOnPageChangeListeners() ;

         super.onDestroy() ;
     }

     /**
      * Scroll one item to the right, if possible
      *
      * @param v the view triggering the event
      */
     public void scrollToNext ( @SuppressWarnings("UnusedParameters") View v )
     {
        int currentIndex = m_viewPager.getCurrentItem();

        if( currentIndex < m_viewPager.getAdapter().getCount() - 1 )
        {
           m_viewPager.setCurrentItem( currentIndex + 1, true );
        }
     }

     /**
      * Scroll one item to the left, if possible
      *
      * @param v the view triggering the event
      */
     public void scrollToPrevious ( @SuppressWarnings("UnusedParameters") View v )
     {
        int currentIndex = m_viewPager.getCurrentItem();

        if( currentIndex > 0 )
        {
           m_viewPager.setCurrentItem( currentIndex - 1, true );
        }
     }

     /**
      * Set the visibility of the previous and next buttons based on view pager contents and position
      */
     public void setPreviousAndNextButtonVisibility ()
     {
        final int position = m_viewPager.getCurrentItem();

        m_previousButton.setVisibility( position == 0 ? View.INVISIBLE : View.VISIBLE );
        m_nextButton.setVisibility( position < m_viewPager.getAdapter().getCount() - 1 ? View.VISIBLE : View.INVISIBLE );
     }

     /**
      * @return The item fragment which is currently displayed
      */
     @Nullable
     public Fragment getCurrentItemFragment ()
     {
        int currentItem = m_viewPager.getCurrentItem();
        ModelCollectionAlbumPagerAdapter adapter = (ModelCollectionAlbumPagerAdapter)m_viewPager.getAdapter();
        return adapter.getRegisteredFragment( currentItem );
     }

 }
公共类活动
扩展碎片活动
{
//意向数据键
//
公共最终静态字符串照相机\u相册\u选定\u ID\u KEY=“selectedId”;
私有静态最终字符串日志\u TAG=“CameraAlbumActivity”;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
最终意图=getIntent();
最终对象sharedData=SharedDataWrapper.getInstance().getData();
CameraCollection CameraCollection;
如果(sharedData!=null
 public class CameraAlbumActivity
    extends FragmentActivity
 {
    // Intent Data Key
    //
    public final static String CAMERA_ALBUM_SELECTED_ID_KEY = "selectedId" ;

     private static final String LOG_TAG = "CameraAlbumActivity" ;

    @Override
    protected void onCreate ( @Nullable Bundle savedInstanceState )
    {
       super.onCreate( savedInstanceState );

       final Intent intent = getIntent();

       final Object sharedData = SharedDataWrapper.getInstance().getData();

        CameraCollection cameraCollection ;

        if ( sharedData != null && sharedData instanceof CameraCollection )
        {
            cameraCollection = ( CameraCollection ) sharedData;
        }
        else
        {
            // just create an empty collection
            cameraCollection = new CameraCollection() ;
        }

        // Load view
        setContentView( R.layout.album );

        // Get references to buttons
        //
        m_previousButton = (ImageView)findViewById( R.id.album_previous_btn );
        m_nextButton = (ImageView)findViewById( R.id.album_next_btn );

        // Configure view pager
        //
        m_viewPager = (ViewPager)findViewById( R.id.album_view_pager );

       final CameraAlbumPagerAdapter adapter = new CameraAlbumPagerAdapter( getSupportFragmentManager(), cameraCollection );
       m_viewPager.setAdapter( adapter );
       m_viewPager.addOnPageChangeListener( new OnCyclingContentAlbumViewScrollListener( this, adapter ) );

       // Set the selected item
       int selectedId = intent.getIntExtra( CAMERA_ALBUM_SELECTED_ID_KEY, -1 );
       if( selectedId == -1 )
       {
          return;
       }

       List<Camera> models = cameraCollection.getAllModels();

       for ( int i = 0 ; i < models.size() ; i++ )
       {
           Camera camera = models.get( i );
           if ( selectedId == camera.getId() )
           {
               m_viewPager.setCurrentItem( i, false );
               break;
           }
       }
    }

     /**
      * OnPageChangeListeners should be removed to prevent memory leaks
      */
     @Override
     public void onDestroy()
     {
         m_viewPager.clearOnPageChangeListeners() ;

         super.onDestroy() ;
     }

     /**
      * Scroll one item to the right, if possible
      *
      * @param v the view triggering the event
      */
     public void scrollToNext ( @SuppressWarnings("UnusedParameters") View v )
     {
        int currentIndex = m_viewPager.getCurrentItem();

        if( currentIndex < m_viewPager.getAdapter().getCount() - 1 )
        {
           m_viewPager.setCurrentItem( currentIndex + 1, true );
        }
     }

     /**
      * Scroll one item to the left, if possible
      *
      * @param v the view triggering the event
      */
     public void scrollToPrevious ( @SuppressWarnings("UnusedParameters") View v )
     {
        int currentIndex = m_viewPager.getCurrentItem();

        if( currentIndex > 0 )
        {
           m_viewPager.setCurrentItem( currentIndex - 1, true );
        }
     }

     /**
      * Set the visibility of the previous and next buttons based on view pager contents and position
      */
     public void setPreviousAndNextButtonVisibility ()
     {
        final int position = m_viewPager.getCurrentItem();

        m_previousButton.setVisibility( position == 0 ? View.INVISIBLE : View.VISIBLE );
        m_nextButton.setVisibility( position < m_viewPager.getAdapter().getCount() - 1 ? View.VISIBLE : View.INVISIBLE );
     }

     /**
      * @return The item fragment which is currently displayed
      */
     @Nullable
     public Fragment getCurrentItemFragment ()
     {
        int currentItem = m_viewPager.getCurrentItem();
        ModelCollectionAlbumPagerAdapter adapter = (ModelCollectionAlbumPagerAdapter)m_viewPager.getAdapter();
        return adapter.getRegisteredFragment( currentItem );
     }

 }
getSupportFragmentManager().executePendingTransactions();