加载器onLoadFinished()未调用

Nik*_*oni 5 android loader sharedpreferences

在偏好更改侦听器中我已将其设置为使用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;
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

装载机实施

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;
}
}
Run Code Online (Sandbox Code Playgroud)

装载机:

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);
}
Run Code Online (Sandbox Code Playgroud)

小智 0

您没有Loader正确实施和使用。但这是一件很难做到的事情。

从上面的代码中我看到您使用了该forceload()方法,但您尚未在Loader. 如果您检查 Loaders 的源代码,则此方法仅调用onForceload()不执行任何操作的事件。根据文档,“子类必须实现它来处理对 的请求forceLoad()。这将始终从进程的主线程中调用。”

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

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

  1. initLoader
  2. restartLoader
  3. destroyLoader

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