gpt4 book ai didi

java - Android 中任务的优先级

转载 作者:行者123 更新时间:2023-12-01 11:33:48 24 4
gpt4 key购买 nike

我有一个 map 应用程序,每次用户移动 map 时,我都必须向后端发出新请求以接收积分。

现在我已经对获取积分的过程进行了很多优化。但我想向我的线程添加优先级功能。

它正在串行执行线程(一个在另一个之前)。但是当我之前已经处理过更大的绑定(bind)线程时,我的优化效果会更好。

以下是我现在实现 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,在该执行器中我可以使具有较大边界的线程在较小边界之前执行。 (参数currentBounds)

我不知道该怎么做,或者我是否应该用另一种线程方法来实现它。

PS:如果我实现一个Executor,有什么方法可以获取它上面的AsyncTask的参数吗?

最佳答案

您需要一个自定义执行器。当您调用execute()时,它使用默认执行器串行运行所有任务。如果调用executeOnExecutor(),您可以指定一个执行器。默认是串行的,还有 THREAD_POOL_EXECUTOR 它将并行运行任务。如果您想要一个优先级队列,您需要编写自己的队列来保留任务的优先级队列并根据优先级串行执行它们。

关于java - Android 中任务的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com