Действительно ли возможно использовать AsyncTask в Классе обслуживания?

Все находится в заголовке.

На официальной документации это указано это Note that services, like other application objects, run in the main thread of their hosting process и AsyncTask только работает, если он выполняется в UIThread.

Таким образом, действительно ли возможно использовать AsyncTask в Классе обслуживания?

Я пытаюсь сделать так, но я всегда получаю ту же ошибку

05-01 18:09:25.487: ERROR/JavaBinder(270): java.lang.ExceptionInInitializerError

...

05-01 18:09:25.487: ERROR/JavaBinder(270): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Я делаю что-то не так, или это просто невозможно?

Вот код моего Класса обслуживания

package com.eip.core;

import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class NetworkService extends Service {


    private final INetwork.Stub mBinder = new INetwork.Stub() {

        @Override
        public int doConnect(String addr, int port) throws RemoteException {
            new ConnectTask().execute("test42");
            return 0;
        }
    };

    @Override
    public IBinder onBind(Intent arg0) {
        return mBinder;
    }

    private class ConnectTask extends AsyncTask<String, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.i("OnPreExecute()", "");
        }

        @Override
        protected Void doInBackground(String... arg0) {
            Log.i("doInBackground()", "");
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Log.i("OnPostExecute()", "");
        }

    }
}
19
задан Spredzy 1 May 2010 в 16:32
поделиться

3 ответа

Думаю, я нашел, почему в моем случае это не работает.

Здесь я использую это:

private final INetwork.Stub mBinder = new INetwork.Stub() {

        @Override
        public int doConnect(String addr, int port) throws RemoteException {
            new ConnectTask().execute("test42");
            return 0;
        }
    };

Я использую это для так называемого IPC, межпроцессного взаимодействия , поэтому я предполагаю, что моя служба и моя активность находятся в двух разных процессах, AsyncTask должен выполняться в основном потоке пользовательского интерфейса в соответствии с документом Android, поэтому почему я пытался это сделать, мне кажется просто невозможным в соответствии с этими фактами.

Если я ошибаюсь, пожалуйста, кто-нибудь меня поправит.

2
ответ дан 30 November 2019 в 05:04
поделиться

Возможно, проблема не в AsyncTask, а в чем-то другом. Например, вы уверены, что ваш метод onBind работает правильно? Пожалуйста, попробуйте следующее:

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

Вы также можете попробовать это

public class NetworkService extends Service{
  @Override
  public void onStart(Intent intent, int startId) {
    new ConnectTask().execute("test42");
  }
}
1
ответ дан 30 November 2019 в 05:04
поделиться

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

12
ответ дан 30 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: