当加载程序重新启动时,onLoadFinished并不总是被调用

问题描述:

我让我的用户将文件下载到云后,我希望我的应用程序重新启动加载程序。当加载程序重新启动时,onLoadFinished并不总是被调用

此前,onLoadFinished并不总是被称为(随机),当我以下列方式

public void reloadAfterOpenFromCloud() { 
    LoaderManager loaderManager = this.getLoaderManager(); 
    loaderManager.restartLoader(0, bundle, this); 
} 

写我的代码指的是讨论Android - onLoadFinished not called后,我修改我的代码

public void reloadAfterOpenFromCloud() { 
    // https://*.com/questions/16014992/android-onloadfinished-not-called 
    // This seems to be a realiable way, to make sure onCreateLoader and onLoadFinished will 
    // be called. 
    LoaderManager loaderManager = this.getLoaderManager(); 
    Loader loader = loaderManager.getLoader(0); 
    if (loader != null) { 
     loaderManager.destroyLoader(0); 
    } 
    loaderManager.restartLoader(0, bundle, this); 
} 

这减少了不致电onLoadFinished的机会。但是,它仍然会随机发生,如果我

  1. 做一个清除缓存,干净的卸载我的应用程序。
  2. 安装该应用。
  3. 运行reloadAfterOpenFromCloud。再次,随机地,onLoadFinished将不会被调用。

onLoadFinished没有被调用,如果我再次运行reloadAfterOpenFromCloudonLoadFinished将被调用。

我正在使用最新的com.android.support:support-v4:25.0.0targetSdkVersion 25

我在想,是否有任何可行的解决方法,以确保onLoadFinished始终被调用,当加载程序重新启动?


下面是我的代码片段的一部分。

public void reloadAfterOpenFromCloud() { 
    // https://*.com/questions/16014992/android-onloadfinished-not-called 
    // This seems to be a realiable way, to make sure onCreateLoader and onLoadFinished will 
    // be called. 
    LoaderManager loaderManager = this.getLoaderManager(); 
    Loader loader = loaderManager.getLoader(0); 
    if (loader != null) { 
     loaderManager.destroyLoader(0); 
    } 
    loaderManager.restartLoader(0, bundle, this); 
} 

static class HomeMenuRowInfosLoader extends AsyncTaskLoader<List<HomeMenuRowInfo>> { 

    private List<HomeMenuRowInfo> homeMenuRowInfos = null; 

    public HomeMenuRowInfosLoader(Context context) { 
     super(context); 
    } 

    @Override 
    public List<HomeMenuRowInfo> loadInBackground() { 
     ... 
     return homeMenuRowInfos; 
    } 

    /** 
    * Handles a request to cancel a load. 
    */ 
    @Override 
    public void onCanceled(List<HomeMenuRowInfo> homeMenuRowInfos) { 
     super.onCanceled(homeMenuRowInfos); 
    } 

    /** 
    * Handles a request to stop the Loader. 
    * Automatically called by LoaderManager via stopLoading. 
    */ 
    @Override 
    protected void onStopLoading() { 
     // Attempt to cancel the current load task if possible. 
     cancelLoad(); 
    } 

    /** 
    * Handles a request to start the Loader. 
    * Automatically called by LoaderManager via startLoading. 
    */ 
    @Override   
    protected void onStartLoading() { 
     if (this.homeMenuRowInfos != null) { 
      deliverResult(this.homeMenuRowInfos); 
     } 

     if (takeContentChanged() || this.homeMenuRowInfos == null) { 
      forceLoad(); 
     } 
    } 

    /** 
    * Handles a request to completely reset the Loader. 
    * Automatically called by LoaderManager via reset. 
    */ 
    @Override 
    protected void onReset() { 
     super.onReset(); 

     // Ensure the loader is stopped 
     onStopLoading(); 

     // At this point we can release the resources associated with 'apps' 
     // if needed. 
     this.homeMenuRowInfos = null; 
    }   
} 

@Override 
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) { 
    return new HomeMenuRowInfosLoader(this.getActivity()); 
} 

// Not being called always when restart loader 
@Override 
public void onLoadFinished(Loader<List<HomeMenuRowInfo>> arg0, List<HomeMenuRowInfo> homeMenuRowInfos) { 
    ... 
+0

请为您的'HomeMenuRowInfosLoader'类添加完整的代码。当我调用onContentChanged()时,我特别感兴趣。 –

+0

@krislarson我更新了代码。谢谢。 –

您需要实现某种观察员在HomeMenuRowInfosLoader,将调用onContentChanged()当用户完成云的文件传输。

如果onContentChanged()不会被调用,takeContentChanged()将始终返回falseforceLoad()不会被内onStartLoading()此时homeMenuRowInfos不等于空先装后调用。

+0

我有调试。当“onLoadFinished未被调用”问题发生时调用'forceLoad'。 –

+0

如果每个'restartLoader'都有匹配的'forceLoad',但没有获得'onLoadFinished',我不确定那是什么。在'loadInBackground'中,你是否总是使用'homeMenuRowInfos = new ArrayList ()'或者重用列表?我在'LoaderManager'中看到一些代码,如果新数据==先前的数据,它看起来会跳过'onLoadFinished'。 –