我有一些与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类。有人可以帮帮我吗?
答案 0 :(得分:0)
问题是在Looper
的{{1}}方法中使用AsyncTask
。 doInBackground()
不是通用的线程机制:它旨在在由系统管理的后台工作线程上执行短期事务。您的AsyncTask
方法不应无限期阻塞,永远循环等等。doInBackground()
类通常由将在Android中使用消息队列的线程使用,允许您附加Looper
反对他们。
本文将帮助阐明Handler
的工作原理:http://po.st/Cei3m2