AsyncTask任务进入无限循环

时间:2016-11-29 22:16:11

标签: java android

我有一些与AsyncTask无限循环的问题.. 这是我在片段类

中使用AsyncTask的方法
public AsyncTask<Void, Void, Void> refreshTask  = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {

        Looper.prepare();
        System.out.println("UŠAO SAM U DO IN BACKGRASD");
        Ponuda.deleteAll();
        ArrayList<Ponuda> novaLista= new ArrayList<Ponuda>();
        novaLista= (ArrayList<Ponuda>) Ponuda.getAll();

        System.out.println("PONUDE: "+ novaLista.size());
        ((MainActivity)getActivity()).loadData();
        Looper.loop();
        System.out.println("asdasd"+ Looper.myLooper());
        return null;
    }

    @Override
    protected void onPostExecute(Void Void) {
        System.out.println("UŠAO SAM U DO IN Post");
        mSwipeRefreshLayout.setRefreshing(false);
        ArrayList<Ponuda> novaLista= new ArrayList<Ponuda>();
        novaLista= (ArrayList<Ponuda>) Ponuda.getAll();

        System.out.println("PONUDE: "+ novaLista.size());
        RVAdapter adapter = new RVAdapter(novaLista,getContext());
        rv.setAdapter(adapter);
        super.onPostExecute(Void);
    }
};
@Override
public void onRefresh() {
    System.out.println("Refreshana je stranica");
    refreshTask.execute();

}`

这是我从片段

调用的方法
 public void loadData(){
    System.out.println("Poziva se funkcija za dohvat podataka");
    DataLoader dataLoader;
    dataLoader = new WebServiceDataLoader();

    if(Ponuda.getAll().isEmpty() || Grad.getAll().isEmpty()){
        System.out.println("Dohvaćamo web podatke");
        Toast.makeText(this, "Dohvaćamo podatke s weba", Toast.LENGTH_LONG).show();
        dataLoader = new WebServiceDataLoader();
    } else {
        System.out.println("Dohvaćamo lokalne podatke");
        Toast.makeText(this, "Dohvaćamo podatke lokalno", Toast.LENGTH_LONG).show();
        dataLoader = new DatabaseDataLoader();
    }

    dataLoader.loadData(this);

    System.out.println("asdasdasd");
}

当我调试时,程序运行此函数并转到片段inicialization然后转到无限循环。首先进入ActivityThread类,然后进入Handler类,然后进入Looper类,它一次又一次地重复thoose类。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

问题是在Looper的{​​{1}}方法中使用AsyncTaskdoInBackground()不是通用的线程机制:它旨在在由系统管理的后台工作线程上执行短期事务。您的AsyncTask方法不应无限期阻塞,永远循环等等。doInBackground()类通常由将在Android中使用消息队列的线程使用,允许您附加Looper反对他们。

本文将帮助阐明Handler的工作原理:http://po.st/Cei3m2