Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 未调用加载程序onLoadFinished()_Android_Sharedpreferences_Loader - Fatal编程技术网

Android 未调用加载程序onLoadFinished()

Android 未调用加载程序onLoadFinished(),android,sharedpreferences,loader,Android,Sharedpreferences,Loader,在preference change listener中,我将其设置为使用Loader下载新数据,然后填充ListView,但当我更改首选项时,仅调用onCreateLoader()函数,而onLoadFinished()回调函数保持未调用状态,因此,我的ListView在“未使用新数据更新”中,我还碰巧有一个刷新按钮,它执行相同的操作,即下载数据增益并使用新数据填充列表,但此处通过更新列表调用onLoadFinished() 刷新按钮代码 case R.id.menu_refresh :

在preference change listener中,我将其设置为使用
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被调用