Почему бы не просто скачать все это в фоновом режиме, а не делать это каждый раз, когда есть запрос? У меня есть приложение, в котором я думал, что делаю то же самое, что вы делаете, но решил использовать фоновый поток, чтобы сделать это вместо этого.
Вот отличный пример того, как использовать нити
http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/
Как я реализовал это было то, что я получить общее количество записей, доступных первыми, а затем начать новую тему для каждой «страницы» записи, которые я хочу получить.
// Create and launch the download thread
downloadThread = new DownloadThread(this);
downloadThread.start();
// Create the Handler. It will implicitly bind to the Looper
// that is internally created for this thread (since it is the UI
// thread)
handler = new Handler();
resultCount = getResultCount(search).trim();
resultsCount = Integer.parseInt(resultCount);
page = 1;
if (resultsCount > 0) {
downloadThread
.enqueueDownload(new DownloadTask(page));
}
Я добавил свой метод для получения записей в DownloadTask.java из приведенного выше примера, и называют его от запуска(), и я добавил еще один публичный метод для получения результатов, как только
Я модифицированные DownloadThread. Java, так что синхронизируются вызов к задаче (DownloadTask) называет свой метод в DownloadTask >> task.run() и, наконец, {} я получить возвращаемые результаты
public synchronized void enqueueDownload(final DownloadTask task) {
// Wrap DownloadTask into another Runnable to track the statistics
handler.post(new Runnable() {
@Override
public void run() {
try {
task.run();
} finally {
// register task completion
synchronized (DownloadThread.this) {
results = task.getResults();
totalCompleted++;
}
// tell the listener something has happened
signalUpdate();
}
}
});
Затем я добавил новый метод DownloadThread.java что позволяет мне получить результаты fr О.М. уведомление об обновлении в моей деятельности
public synchronized ArrayList<Result> getResults() {
return results;
}
Например, если есть 60 записей, и каждая страница содержит 6 записей, я начинаю поток, чтобы получить первые 6, а затем, когда handleDownloadThreadUpdate() называется я наполнитьсетевой массив с этими результатами и вызовите метод в моем адаптере, называемый update(), который вызывает notifyDataSetChanged().
public void handleDownloadThreadUpdate() {
handler.post(new Runnable() {
@Override
public void run() {
for (Result res : downloadThread.getResults()) {
if (!results.contains(res)) {
results.add(intern(res));
}
}
arrayAdapter.update();
int pages = (int) Math.ceil(resultsCount/6);
if (page < pages) {
page = page + 1;
downloadThread.enqueueDownload(new DownloadTask(page));
}
}
});
}
Таким образом, он рекурсивно загружает страницы и добавляет результаты в мой список.
Еще одна вещь, о которой я забыл упомянуть. У меня есть класс под названием Result, который содержит каждый результат, который я храню в ArrayList. На всякий случай, если результаты попытаются использовать слишком много памяти, я кэширую их в WeakReference HashMap ..., поскольку вы можете увидеть вызов intern(), когда он добавлен в ArrayList выше.
private Map<Result, WeakReference<Result>> myInternMap = new HashMap<Result, WeakReference<Result>>();
public Result intern(Result value) {
synchronized (myInternMap) {
WeakReference<Result> curRef = myInternMap.get(value);
Result curValue = ((curRef != null) ? curRef.get() : null);
if (curValue != null) {
return curValue;
}
myInternMap.put(value, new WeakReference<Result>(value));
return value;
}
}