Java AsyncTaskLoader未启动
我在装载机方面有些问题,但我不明白我做错了什么。 这是初始化和启动加载程序的片段Java AsyncTaskLoader未启动,java,android,android-asynctask,loader,Java,Android,Android Asynctask,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.vie
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<ArrayList<ChurchListItem>> {
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<ArrayList<ChurchListItem>> onCreateLoader(int id, Bundle args) {
Debug.d(Debug.LOADER_DEBUG_TAG, "onCreateLoader");
return new ChurchListLoader(getContext());
}
@Override
public void onLoadFinished(Loader<ArrayList<ChurchListItem>> loader, ArrayList<ChurchListItem> data) {
Debug.d(Debug.LOADER_DEBUG_TAG, "onLoadFinished");
}
@Override
public void onLoaderReset(Loader<ArrayList<ChurchListItem>> loader) {
}
}
导入android.os.Bundle;
导入android.support.v4.app.LoaderManager;
导入android.support.v4.content.Loader;
导入android.support.v7.widget.Toolbar;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入com.pixelark.bulletinplus.R;
导入com.pixelark.bulletinplus.async.ChurchListLoader;
导入com.pixelark.bulletinplus.debug.debug;
导入com.pixelark.bulletinplus.model.ChurchListItem;
导入java.util.ArrayList;
公共类ListFragment扩展了android.support.v4.app.Fragment
实现LoaderManager.LoaderCallbacks{
私有静态最终int CHURCH\u LIST\u LOADER\u ID=777;
公共教会{
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u church\u列表,容器,false);
Toolbar Toolbar=(Toolbar)getActivity().findViewById(R.id.Toolbar);
toolbar.setTitle(“ChurchListFragment”);
getLoaderManager().initLoader(CHURCH_LIST_LOADER_ID,null,this);
返回rootView;
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
Debug.d(Debug.LOADER_Debug_标记,“onCreateLoader”);
返回新的列表加载器(getContext());
}
@凌驾
public void onLoadFinished(加载程序、ArrayList数据){
Debug.d(Debug.LOADER_Debug_标记,“onLoadFinished”);
}
@凌驾
公共void onLoaderReset(加载器){
}
}
这是我编写的一个简单加载程序:
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<ArrayList<ChurchListItem>> {
public ChurchListLoader(Context context) {
super(context);
}
@Override
public ArrayList<ChurchListItem> 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;
}
}
导入android.content.Context;
导入android.util.Log;
导入com.pixelark.bulletinplus.contract.urlcract;
导入com.pixelark.bulletinplus.debug.debug;
导入com.pixelark.bulletinplus.model.ChurchListItem;
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
公共类ListLoader扩展了android.support.v4.content.AsyncTaskLoader{
公共列表加载器(上下文){
超级(上下文);
}
@凌驾
公共阵列列表loadInBackground(){
Debug.d(Debug.LOADER_Debug_标记,“loadInBackground”);
试一试{
URL=新URL(UrlContract.URL\u BASE+UrlContract.URL\u BASE);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod(“GET”);
字符串responseMessage=connection.getResponseMessage();
InputStreamReader InputStreamReader=新的InputStreamReader(connection.getInputStream());
BufferedReader BufferedReader=新的BufferedReader(inputStreamReader);
弦线;
而((line=bufferedReader.readLine())!=null){
Log.d(Debug.LOADER_Debug_标记,“行:”+行);
}
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}
注意日志
日志输出:
D/LOADER\u DEBUG\u标记:onCreateLoader
这就是所有的日志输出,我不明白为什么Loader不启动loadInBackground()方法
谢谢。我有点惊讶地发现
AsyncTaskLoader
并没有像AsyncTask
那样自动启动
下面是一个覆盖onStartLoading()
的最小示例,它将帮助您继续:
@Override
protected void onStartLoading() {
forceLoad();
}
根据需要,您可能需要为此方法添加一些逻辑。这将始终尝试获取新的数据集。如果已经加载了数据,但数据没有更改,则可以立即调用deliverResult()
查看
AsyncTaskLoader
的JavaDocs,查看onStartLoading()
的一个示例实现,我有点惊讶地发现AsyncTaskLoader
并没有像AsyncTask
那样自动启动
下面是一个覆盖onStartLoading()
的最小示例,它将帮助您继续:
@Override
protected void onStartLoading() {
forceLoad();
}
根据需要,您可能需要为此方法添加一些逻辑。这将始终尝试获取新的数据集。如果已经加载了数据,但数据没有更改,则可以立即调用deliverResult()
查看JavaDocs for
AsyncTaskLoader
,以查看onStartLoading()
的示例实现,您应该将其称为youself
@Override
public Loader<ArrayList<ChurchListItem>> onCreateLoader(int id, Bundle args) {
Debug.d(Debug.LOADER_DEBUG_TAG, "onCreateLoader");
return new ChurchListLoader(getContext()).startLoading();
}
@覆盖
公共加载器onCreateLoader(int-id,Bundle-args){
Debug.d(Debug.LOADER_Debug_标记,“onCreateLoader”);
返回新的ChurchListLoader(getContext()).startLoading();
}
你应该称之为你自己
@Override
public Loader<ArrayList<ChurchListItem>> onCreateLoader(int id, Bundle args) {
Debug.d(Debug.LOADER_DEBUG_TAG, "onCreateLoader");
return new ChurchListLoader(getContext()).startLoading();
}
@覆盖
公共加载器onCreateLoader(int-id,Bundle-args){
Debug.d(Debug.LOADER_Debug_标记,“onCreateLoader”);
返回新的ChurchListLoader(getContext()).startLoading();
}
切勿直接调用loadInBackground()
。这将使任务在UI线程上执行,而不是在后台线程上执行。也许你应该使用startLoading(),因为它不能完成任务!切勿直接调用loadInBackground()
。这将使任务在UI线程上执行,而不是在后台线程上执行。也许你应该使用startLoading(),因为它不能完成任务!尝试在29/7,工作希望谷歌将罚款这一问题在29/7,工作希望谷歌将罚款这一问题