2015-05-12 2 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, где я хотел бы сделать темы с более крупными границы выполняются до меньших. (param currentBounds)

Я не знаю, как это сделать, или если я должен реализовать его с использованием другого потока.

PS: Если я реализую Исполнителя, есть ли способ получить на нем параметры AsyncTask?

ответ

1

Вам нужен пользовательский исполнитель. Когда вы вызываете execute(), он использует исполнитель по умолчанию, который выполняет все задачи поочередно. Если вы вызываете executeOnExecutor(), вы можете указать исполнителя. По умолчанию используется serial, есть также THREAD_POOL_EXECUTOR, который будет запускать задачи параллельно. Если вам нужна очередь приоритетов, вам нужно будет написать свою собственную, которая будет хранить очереди приоритетов и выполнять их поочередно на основе приоритета.

+0

Должен ли я использовать его из класса Executor? Как мне получить currentBounds var, чтобы сделать мое сжатие того, что поток должен иметь больший приоритет? – wviana

Смежные вопросы