Привет, у меня есть несколько вопросов, касающихся Looper.prepare () и AsyncTasks.
В моем приложении у меня есть AsyncTask, которая запускает другие AsyncTask. У меня было 2 AsyncTasks Search и GetImage. Задача GetImage выполняется несколько раз в задаче поиска. Работает нормально.
Однако недавно я реализовал кэширование изображений, как описано здесь:
http://android -developers.blogspot.com / 2010/07 / многопоточность-для-performance.html
После того, как я это реализовал, у меня стали периодически возникать сбои
02-09 17: 40: 43.334: W / System.err (25652): java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare ()
Я не уверен, куда мне следует позвонить prepare (). Вот примерный набросок кода
Search extends AsyncTask{
@Override
protected void doInBackground(){
ArrayList<Object> objs = getDataFromServer();
ArrayList<View> views = new ArrayList<View>();
for(Object o: objs){
//multiple AsyncTasks may be started while creating views
views.add(createView(o));
}
for(View v: views){
publishProgess(v);
}
}
}
public View createView(Object o){
//create a view
ImageView iv = .....;
ImageDownloader.getInstance().download(url,iv);
}
ImageDownloader можно увидеть по ссылке выше, в нем есть еще одна AsyncTask для загрузки изображения. Он также содержит обработчик и Runnable для очистки кэша, который сбрасывается каждый раз при загрузке. Я сделал одно изменение в ImageDownloader, я сделал его синглтоном.
public static ImageDownloader getInstance(){
if(instance == null){
//tried adding it here but it results in occasional
//cannot create more than one looper per thread error
Looper.prepare();
instance= new ImageDownloader();
}
return instance;
}
Метод загрузки ImageDownloader может вызываться 10 раз, что создает AysncTask для каждой загрузки. Так что последние несколько дней я чесал голову, надеюсь, вы, ребята, можете помочь.