【问题标题】:Loader onLoadFinished() not called未调用加载程序 onLoadFinished()
【发布时间】:2017-01-25 08:58:02
【问题描述】:

在首选项更改侦听器中,我已将其设置为使用Loader 下载新数据,然后填充ListView,但是当我更改首选项时仅调用onCreateLoader() 函数,onLoadFinished() 回调函数保持未调用,因此我的ListView 没有用新数据更新,我也碰巧有一个刷新按钮,它做同样的事情,即下载数据增益并用新数据填充列表,但这里onLoadFinished() 被调用,因此通过更新列表。

刷新按钮代码

case R.id.menu_refresh :
            ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null &&  activeNetwork.isConnectedOrConnecting();
            if(isConnected)
            {
                getSupportLoaderManager().initLoader(0,null,this).forceLoad();
            }
            else {
                Toast.makeText(this,"No Internet",Toast.LENGTH_SHORT).show();
            }
            break;

SharedPreference 监听器代码:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null &&  activeNetwork.isConnectedOrConnecting();
    if(isConnected)
    {
        //delfromold();
        getSupportLoaderManager().initLoader(0,null,this).forceLoad();
        Log.v("Prefrences Changed",s);
    }
}

编辑

加载器实现

public class Loade extends AsyncTaskLoader<ArrayList<CustomL>>{

Context mCon;

public Loade(Context context) {
    super(context);
    mCon = context;
}

@Override
public ArrayList<CustomL> loadInBackground() {
    ArrayList<CustomL> maList = null;
    try {
        Log.v("Loader","Called");
        maList = GetList.makelist(mCon);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return maList;
}
}

加载器:

public Loader<ArrayList<CustomL>> onCreateLoader(int id, Bundle args) {
    return new Loade(this);
}

public void onLoadFinished(Loader<ArrayList<CustomL>> loader, ArrayList<CustomL> data) {
    Log.v("Load","Finished");
    maklst(data);
}

【问题讨论】:

  • 在 Getlist 类的 makelist 函数中,新数据被下载并保存到表中,我可以确认,但是,它只是停在那里 onLoadFinished dosnt 被调用和 maklst 函数用新数据更新列表永远不会被调用,但是当我从刷新调用同一个加载器时,会调用 onLoadFinished

标签: android sharedpreferences loader


【解决方案1】:

您没有正确实施和使用Loader。不过,这很难做到。

从上面的代码中我看到你使用了forceload() 方法,但是你还没有在你的Loader 中实现它。如果您检查 Loaders 的源代码,此方法只调用 onForceload() 事件,它什么都不做。根据文档“子类必须实现这个来处理对forceLoad()的请求。这将始终从进程的主线程中调用。 "

您应该阅读this 教程并从那里开始。

一般概念是,在您完成AsyncTaskLoader 实施后,您的片段/活动将不会直接联系您的加载器。如果你这样做,你最终会遇到活动/片段生命周期的问题。 LoaderManager 负责使用这些方法

  1. initLoader
  2. restartLoader
  3. destroyLoader

之后Loader 将使用LoaderManager.LoaderCallbacks 接口将任何结果报告回片段/活动。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多