выполнение асинхронной задачи из сервиса в android - PullRequest
1 голос
/ 31 марта 2012

Я разрабатывал приложение и столкнулся с проблемой. Я пытался запустить асинхронную задачу из службы, и она не работала. Это говорит о том, что код недоступен. Теперь я знаю, что оба работают в фоновом режиме, но я действительно хочу, чтобы один сервис управлял несколькими асинхронными задачами. Как мне это сделать? Должен ли я использовать темы? Я прочитал этот пост, и я действительно хочу использовать асинхронную задачу: Разница между службой, асинхронной задачей и потоком?

Также возможно ли выполнить асинхронную задачу из другой?

Спасибо

Ответы [ 3 ]

2 голосов
/ 31 марта 2012

AsyncTask всегда работает в основном потоке / пользовательском интерфейсе.И если ваш Service работает под другим процессом , то он не связан с основным потоком, поэтому вы не можете использовать AsyncTask в Service.

В вашем случае,Вам рекомендуется использовать HandlerThread, Looper и Handler для выполнения тяжелого подъема на отдельной нити.

Читать эту статью.

1 голос
/ 31 марта 2012

вы можете использовать HandlerThread в вашем сервисе для выполнения фоновой работы, например:

public class ServicewithHandlerThread extends Service {
  private Looper mServiceLooper;
  private ServiceHandler mServiceHandler;
  private final class ServiceHandler extends Handler {
      public ServiceHandler(Looper looper) {
          super(looper);
      }
      @Override
      public void handleMessage(Message msg) {

          while (true) {
              synchronized (this) {
                  try {
                      //YOUR BACKGROUND WORK HERE
                  } catch (Exception e) {
                  }
              }
          }
          stopSelf(msg.arg1);
      }
  }
  @Override
  public void onCreate() {
    // Start up the thread running the service.
    HandlerThread thread = new HandlerThread("ServiceStartArguments",
            Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();
    // Get the HandlerThread's Looper and use it for our Handler
    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      Message msg = mServiceHandler.obtainMessage();
      msg.arg1 = startId;
      mServiceHandler.sendMessage(msg);
      return START_STICKY;
  }
  @Override
  public IBinder onBind(Intent intent) {
      return null;
  }
}
0 голосов
/ 31 марта 2012

Есть несколько вариантов.Если вам нужна связь между вашей задачей и, скажем, действием, AsyncTask будет вашим лучшим, IMO.Если вам просто нужно «выстрелить и забыть», IntentService может помочь.

Помните, что служба все еще работает в основном потоке.Если вам нужно сделать что-нибудь, что требует некоторой обработки или поиска, например, загрузка / выгрузка по сети или SQL-запросы, вы должны переместить это в новый поток, используя один из вышеупомянутых классов.

...