在偏好更改侦听器中,我已将其设置为使用Loader
下载新数据,然后填充ListView
,但在更改首选项时仅调用onCreateLoader()
函数,{ {1}}回调函数仍然未被调用,因此我的onLoadFinished()
未更新新数据,我也碰巧有一个刷新按钮执行相同的操作,即下载数据增益并用新数据填充列表但在这里因此,通过更新列表来调用ListView
。
刷新按钮代码
onLoadFinished()
SharedPreference侦听器代码:
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;
修改
Loader Implementation
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;
}
}
答案 0 :(得分:0)
您没有正确实施和使用Loader
。但是,这很难做到。
从上面的代码中我看到您使用forceload()
方法,但您尚未在Loader
中实现它。如果检查Loaders的源代码,则此方法只调用不执行任何操作的onForceload()
事件。根据文档&#34;子类必须实现此操作以处理对forceLoad()
的请求。这将始终从进程的主线程调用。
&#34;
您应该阅读this教程并从那里开始。
一般概念是,在您完成AsyncTaskLoader
实施后,您的片段/活动将不会直接与您的Loader联系。如果这样做,您将最终遇到活动/片段生命周期的问题。 LoaderManager负责使用这些方法
initLoader
restartLoader
destroyLoader
之后,Loader
将使用LoaderManager.LoaderCallbacks
界面将任何结果报告回片段/活动。