我在装载机上遇到了一些麻烦,但是我不明白我做错了什么。这是初始化并启动Loader的片段
import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.pixelark.bulletinplus.R; import com.pixelark.bulletinplus.async.ChurchListLoader; import com.pixelark.bulletinplus.debug.Debug; import com.pixelark.bulletinplus.model.ChurchListItem; import java.util.ArrayList; public class ChurchListFragment extends android.support.v4.app.Fragment implements LoaderManager.LoaderCallbacks> { private static final int CHURCH_LIST_LOADER_ID = 777; public ChurchListFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_church_list, container, false); Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); toolbar.setTitle("ChurchListFragment"); getLoaderManager().initLoader(CHURCH_LIST_LOADER_ID, null, this); return rootView; } @Override public Loader > onCreateLoader(int id, Bundle args) { Debug.d(Debug.LOADER_DEBUG_TAG, "onCreateLoader"); return new ChurchListLoader(getContext()); } @Override public void onLoadFinished(Loader > loader, ArrayList data) { Debug.d(Debug.LOADER_DEBUG_TAG, "onLoadFinished"); } @Override public void onLoaderReset(Loader > loader) { } }
这是我写的一个简单的加载器:
import android.content.Context; import android.util.Log; import com.pixelark.bulletinplus.contract.UrlContract; import com.pixelark.bulletinplus.debug.Debug; import com.pixelark.bulletinplus.model.ChurchListItem; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; public class ChurchListLoader extends android.support.v4.content.AsyncTaskLoader> { public ChurchListLoader(Context context) { super(context); } @Override public ArrayList loadInBackground() { Debug.d(Debug.LOADER_DEBUG_TAG, "loadInBackground"); try { URL url = new URL(UrlContract.URL_BASE + UrlContract.URL_BASE); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); String responseMessage = connection.getResponseMessage(); InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream()); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String line; while ((line = bufferedReader.readLine()) != null) { Log.d(Debug.LOADER_DEBUG_TAG, "Line: " + line); } } catch (Exception e) { e.printStackTrace(); } return null; } }
请注意LOGS。
日志输出:D / LOADER_DEBUG_TAG:onCreateLoader
这就是所有日志输出,我不明白为什么Loader无法启动方法loadInBackground();。
谢谢。
我很惊讶地发现,AsyncTaskLoader
它不会自动以相同的方式启动AsyncTask
。
这是一个替代的最小示例,onStartLoading()
它可以助您一臂之力:
@Override protected void onStartLoading() { forceLoad(); }
您可能需要根据需要向此方法添加一些逻辑。这将始终尝试获取新的数据集。如果您已经加载了数据并且尚未更改,则可以立即致电deliverResult()
。
查看JavaDocs,AsyncTaskLoader
以了解的示例实现onStartLoading()
。