2015-05-12 87 views
0

我有一个地图应用程序,每当用户移动地图时,我都必须向后端发出一个新请求以接收点。优先考虑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,在那里我会制备线具有较大的洞察力边界在较小的之前执行。 (参数currentBounds)

我不知道该怎么做,或者如果我应该用另一个线程方法实现它。 PS:如果我实现了一个Executor,有什么方法可以获得AsyncTask的params吗?

回答

1

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

+0

我需要从Executor类实现吗?我将如何获得currentBounds var来使我的压缩的线程应该具有更大的优先级? – wviana