未调用加载程序 onLoadFinished()
Posted
技术标签:
【中文标题】未调用加载程序 onLoadFinished()【英文标题】:Loader onLoadFinished() not called 【发布时间】: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 【参考方案1】:您没有正确实施和使用Loader
。不过,这很难做到。
从上面的代码中我看到你使用了forceload()
方法,但是你还没有在你的Loader
中实现它。如果您检查 Loaders 的源代码,此方法只调用 onForceload()
事件,它什么都不做。根据文档“子类必须实现这个来处理对forceLoad()
的请求。这将始终从进程的主线程中调用。
"
您应该阅读this 教程并从那里开始。
一般概念是,在您完成AsyncTaskLoader
实施后,您的片段/活动将不会直接联系您的加载器。如果你这样做,你最终会遇到活动/片段生命周期的问题。 LoaderManager 负责使用这些方法
initLoader
restartLoader
destroyLoader
之后Loader
将使用LoaderManager.LoaderCallbacks
接口将任何结果报告回片段/活动。
【讨论】:
以上是关于未调用加载程序 onLoadFinished()的主要内容,如果未能解决你的问题,请参考以下文章
ViewPager PagerAdapter with cursor - CursorLoader.onLoadFinished 不会被不同的查询调用
AsyncTaskLoader onLoadFinished 有一个挂起的任务和配置更改