Это простое объяснение, но, пожалуйста, потерпите меня ... Вот драконы ...
Хорошо, у меня есть галерея Android и я реализовал GalleryAdapter, который создает мои представления и прочее:
public class GalleryAdapter extends BaseAdapter {....
....
etc
...
Теперь, прежде чем мы начнем, почти ВСЕ примеры, показывающие, как это сделать, предполагают, что вы точно знаете, сколько изображений будет в галерее.В моем случае у меня нет.Это может быть любое произвольное количество изображений, но, по крайней мере, существует согласованное соглашение об именах, например 001, 002, 003 и т. Д.
У меня есть папка где-то на сервере, на которой есть изображения, которые должны отображаться в галерее.:
http://www.somedomain.com/content/pictures
В этой папке изображений у нас может быть
0001.jpg
0002.jpg
0003.jpg
000n.jpg
и т.д. до бесконечности
Теперь BaseAdapter, который я расширяю, ожидает от вас переопределения public int getCount()
Так что, если вы знаете, что у вас есть 20 изображений, вы просто идете:
public int getCount() {return 20;}
И вашна вашем веселом пути.Но как насчет моего случая?
То, как я до сих пор обходился, требует, чтобы файл count.txt был помещен в корень этого каталога, где находятся изображения, содержащие целое число, которое говорит вам, что существует X количествоизображения в нем.Помните, что это http расположение.
Так что мой getCount выглядит примерно так
public int getCount() {
int count = getRemoteImageCount();
if(count == -1)
{
return 0;//Oh crap, something went wrong, what now?!
} else {
return count;
}
public int getRemoteImageCount()
try {
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
conn.setUseCaches(true);
conn.connect();
InputStream instream = conn.getInputStream();
InputStreamReader reader = new InputStreamReader(instream);
String strCount = new String();
int data = reader.read();
while(data != -1){
char theChar = (char) data;
strCount += theChar;
data = reader.read();
}
reader.close();
count = Integer.parseInt(strCount);
} catch (Exception e) {
count = -1
}
return count;
}
Хорошо, теперь, когда у нас есть немного контекста, вот актуальный вопрос.Если по какой-то причине мне не удается получить файл count.txt и я не могу определить, сколько изображений находится в удаленной папке, мне нужно сообщить пользователю, что мы не смогли использовать диалог, и спросить его, хотят ли они повторить попытку или просто проигнорировать его.,Как бы я поступил так?Следующий фрагмент кода - моя попытка, но он терпит неудачу по нескольким причинам, но в основном потому, что диалоги отображаются синхронно.Как мне реализовать (Повторить / Отменить), чтобы перевести мой GalleryAdapter в состояние, когда в конечном итоге сеть резервируется, и я могу хранить эти изображения в Галерее?
Вот моя неработающая попытка.Любые альтернативные предложения также приветствуются.
public int getCount() {
// TODO fetch image amount remotely
int imageCount;
do {
RemoteBitMapHelper rbmh = new RemoteBitMapHelper();
imageCount = rbmh.getBitmapCount(baseUrl + "count.txt");
if(imageCount == -1) {
imageCount = 0;
new AlertDialog.Builder(this.context)
.setTitle("Connection Error")
.setMessage("There was an error connecting to the server")
.setPositiveButton("Retry",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
setRetryGetCount(true);
}
})
.setNegativeButton("Continue",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setRetryGetCount(false);
}
})
.setCancelable(false)
.show();
}
} while(retryGetCount && imageCount <= 0);
return imageCount;
}