我有一个地图应用程序,每次用户移动地图时,我都必须向后端发出新的请求以接收这些点。
现在我已经在优化了很多获得积分的过程。但我想为我的主题添加优先级功能。
它正在串行执行线程(一个接一个)。但是,当我之前处理一个更大的绑定线程时,我的优化效果会更好。
以下是我现在正在实施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的执行程序,我将使较大边界的Threads在较小的边界之前执行。 (param currentBounds)
我不知道该怎么做,或者我是否应该用另一种线程方法来实现它。
PS:如果我实现了Executor,有没有办法在其上获取AsyncTask的参数?
答案 0 :(得分:1)
您需要一个自定义执行程序。当您调用execute()时,它使用一个默认的执行程序,它以串行方式运行所有任务。如果调用executeOnExecutor(),则可以指定执行程序。默认的是串行,还有THREAD_POOL_EXECUTOR,它将并行运行任务。如果你想要一个优先级队列,你需要编写自己的优先级队列来保存任务的优先级队列,并根据优先级顺序执行它们。