2015-12-05 93 views
1

我有一些加载器的问题,但我不明白我做错了什么。 这是init和启动装载程序AsyncTaskLoader不启动

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) { 

    } 
} 

这是一个简单的装载机是我写的片段:

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; 
    } 
} 

支付你的注意力上的日志。

日志输出: d/LOADER_DEBUG_TAG:onCreateLoader

这就是所有的日志输出,我不明白为什么不装载机启动方法loadInBackground();

谢谢。

回答

4

我有点惊讶地发现AsyncTaskLoader不会像AsyncTask那样自动启动。

下面是一个覆盖为onStartLoading()一个小例子,这将让你去:

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

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

查看AsyncTaskLoader的JavaDocs以查看onStartLoading()的示例实现。

+1

谢谢,这是正确的,并为我工作:) – lazexe

+0

尝试在29/7和工作 希望谷歌将罚款这一问题 –

0

Yout应该自己调用它。

@Override 
    public Loader<ArrayList<ChurchListItem>> onCreateLoader(int id, Bundle args) { 
     Debug.d(Debug.LOADER_DEBUG_TAG, "onCreateLoader"); 
     return new ChurchListLoader(getContext()).startLoading(); 
    } 
+1

*不要*调用'loadInBackground()'直接。这将使任务在UI线程而不是后台线程上执行。 –

+0

也许你应该使用startLoading() –

+0

它没有完成这项工作! –