当前位置:  开发笔记 > 编程语言 > 正文

AsyncTaskLoader无法启动

如何解决《AsyncTaskLoader无法启动》经验,为你挑选了1个好方法。

我在装载机上遇到了一些麻烦,但是我不明白我做错了什么。这是初始化并启动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();。

谢谢。



1> kris larson..:

我很惊讶地发现,AsyncTaskLoader它不会自动以相同的方式启动AsyncTask

这是一个替代的最小示例,onStartLoading()它可以助您一臂之力:

   @Override
   protected void onStartLoading() {
       forceLoad();
   }

您可能需要根据需要向此方法添加一些逻辑。这将始终尝试获取新的数据集。如果您已经加载了数据并且尚未更改,则可以立即致电deliverResult()

查看JavaDocs,AsyncTaskLoader以了解的示例实现onStartLoading()

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有