Android 未调用加载程序onLoadFinished()
在preference change listener中,我将其设置为使用Android 未调用加载程序onLoadFinished(),android,sharedpreferences,loader,Android,Sharedpreferences,Loader,在preference change listener中,我将其设置为使用Loader下载新数据,然后填充ListView,但当我更改首选项时,仅调用onCreateLoader()函数,而onLoadFinished()回调函数保持未调用状态,因此,我的ListView在“未使用新数据更新”中,我还碰巧有一个刷新按钮,它执行相同的操作,即下载数据增益并使用新数据填充列表,但此处通过更新列表调用onLoadFinished() 刷新按钮代码 case R.id.menu_refresh :
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;
SharedReference侦听器代码:
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;
}
}
公共类加载扩展了AsyncTaskLoader{
上下文mCon;
公共加载(上下文){
超级(上下文);
mCon=上下文;
}
@凌驾
公共阵列列表loadInBackground(){
ArrayList maList=null;
试一试{
Log.v(“装载机”、“被调用”);
maList=GetList.makelist(mCon);
}捕获(JSONException e){
e、 printStackTrace();
}
返回恶意;
}
}
加载器:
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);
}
public Loader onCreateLoader(int-id,Bundle-args){
返回新的装载(本);
}
public void onLoadFinished(加载程序、ArrayList数据){
日志v(“加载”、“完成”);
maklst(数据);
}
您没有正确实施和使用加载程序。然而,这是一件很难做到的事情
从上面的代码中,我看到您使用了forceload()
方法,但您尚未在加载程序中实现它。如果检查加载程序的源代码,此方法只调用不起任何作用的onForceload()
事件。根据docs的说法,“子类必须实现这一点,以处理对forceLoad()
的请求。这将始终从进程的主线程调用。
"
你们应该阅读教程并从那个里开始
一般的概念是,在您完成AsyncTaskLoader
实现后,您的片段/活动将不会直接联系您的加载程序。如果这样做,您将在活动/片段生命周期中遇到问题。LoaderManager负责使用这些方法实现这一点
initLoader
restartLoader
destroyLoader
之后,Loader
将使用LoaderManager.LoaderCallbacks
接口将任何结果报告回片段/活动。在Getlist类的makelist函数中,新数据被下载并保存到表中,但我可以确认,就在这里,onLoadFinished dosnt get被调用,用新数据更新列表的maklst函数从未被调用,但当我从refresh调用同一个加载程序时,onLoadFinished被调用