优先处理Android中的任务

时间:2015-05-12 20:02:30

标签: java android multithreading geolocation

我有一个地图应用程序,每次用户移动地图时,我都必须向后端发出新的请求以接收这些点。

现在我已经在优化了很多获得积分的过程。但我想为我的主题添加优先级功能。

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

以下是我现在正在实施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的参数?

1 个答案:

答案 0 :(得分:1)

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