Можно ли использовать 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()", "");
}
}
}
5 ответов:
Также не забудьте проверить IntentService. Если этого класса достаточно для ваших нужд, он позаботится о множестве мелких деталей, необходимых для правильной работы этого шаблона.
Я думаю, что нашел, почему это не работает в моем случае.
Здесь я использую это :
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 doc, поэтому то, что я пытался сделать, кажется мне просто невозможным в соответствии с этими фактами.
Если я ошибаюсь, пожалуйста, кто-нибудь может меня поправить.
Возможно, проблема не в 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"); } }
Можно ли использовать AsyncTask в классе обслуживания?
Да. Смотрите Reto Meier (2010) Professional Android 2 Application Development, Wrox. Мейер опубликована соответствующий код (см /главу землетрясение 9 4/ЦСИ/ком/paad/землетрясение/EarthquakeService.java):
public class EarthquakeService extends Service { ... private EarthquakeLookupTask lastLookup = null; ... private class EarthquakeLookupTask extends AsyncTask<Void, Quake, Void> { ... } @Override public int onStartCommand(Intent intent, int flags, int startId) { ... refreshEarthquakes(); return Service.START_NOT_STICKY; }; private void refreshEarthquakes() { ... lastLookup = new EarthquakeLookupTask(); lastLookup.execute((Void[])null); ... } }
В стороне, я не могу найти никаких доказательств в поддержку вашего утверждения, что " AsyncTask работает только в том случае, если он выполняется в UIThread "(хотя это было бы нарушением потоковой обработки правила ).
Хотя можно Использовать
AsyncTask
вService
классе, это нарушает правила потоковой обработки, в частности,AsyncTask
должен быть создан экземпляр и вызван в потоке пользовательского интерфейса. (См. https://stackoverflow.com/a/25172977/3664487 для дальнейшего обсуждения.)