У меня есть приложение карты, и каждый раз, когда пользователь перемещает карту, я должен сделать новый запрос в конец, чтобы получить точки.Приоритет задач в Android
Сейчас я уже много оптимизирую процесс получения очков. Но я хотел бы добавить приоритеты для своих потоков.
Выполнение потоков серийно (один за другим). Но мои оптимизации лучше работают, когда я уже обрабатываю более крупный связанный поток.
Вот как я сейчас реализует свою AsyncTask
:
plotPinsThread = new AsyncTask<Void, Boolean, List<Loja>>() {
final boolean oldMy = showMyStores;
final boolean oldOthers = showOtherStores;
@Override
protected List<Loja> doInBackground(Void... params) {
try {
publishProgress(true);
Log.d(TAG, "=====> Inicio de requisição de pontos");
List<Loja> lojas = new ArrayList<>();
publishProgress(true);
if (showMyStores && !isCancelled()) {
publishProgress(true);
lojas.addAll(lojasDAO.getLojasList(cliente, currentBounds, LojaJsonDAO.DEALERSHIPS, this));
}
if (showOtherStores && !isCancelled()) {
publishProgress(true);
lojas.addAll(concorrentesDAO.getLojasList(others, currentBounds, LojaJsonDAO.COMPETITORS, this));
}
return lojas;
} catch (JSONException e) {
Log.e(TAG, "Erro de Json", e);
}
return new ArrayList<>();
}
@Override
protected void onProgressUpdate(Boolean... values) {
if (values[0]) {
loading.setVisibility(View.VISIBLE);
} else {
loading.setVisibility(View.GONE);
}
}
@Override
protected void onCancelled() {
Log.d(TAG, "Uma Thread foi cancelada: ");
}
@Override
protected void onPostExecute(List<Loja> list) {
publishProgress(true);
boolean isLojasLoaded = lojasCarregadas.containsAll(list);
if (!isLojasLoaded && isEnoughZoom() && oldMy == showMyStores && oldOthers == showOtherStores && !isCancelled()) {
clearMarkers();
for (Loja loja : list) {
publishProgress(true);
if (loja.getPosition() != null) {
mMap.addMarker(getMarker(loja));
}
}
lojasCarregadas.addAll(list);
Log.d(TAG, "=====> Final de requisição de pontos");
} else {
String msg = (isLojasLoaded) ? "já carregados." : "invalidos";
Log.d(TAG, "=====> Final de requisição, dados " + msg);
}
publishProgress(false);
}
}.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
Я читал кое-что о исполнителях и я имел представление о создании исполнителя, который будет реализовывать PriorityQueue, где я хотел бы сделать темы с более крупными границы выполняются до меньших. (param currentBounds)
Я не знаю, как это сделать, или если я должен реализовать его с использованием другого потока.
PS: Если я реализую Исполнителя, есть ли способ получить на нем параметры AsyncTask?
Должен ли я использовать его из класса Executor? Как мне получить currentBounds var, чтобы сделать мое сжатие того, что поток должен иметь больший приоритет? – wviana