是否有可能在Service类中使用AsyncTask?

一切都在标题中。

在官方文档中指出, Note that services, like other application objects, run in the main thread of their hosting process并且AsyncTask只有在UIThread中执行时才起作用。

那么有可能在Service类中使用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()", ""); } } } 

Solutions Collecting From Web of "是否有可能在Service类中使用AsyncTask?"

另外一定要检查出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, 进程间通信 ,所以我想我的服务和我的Activity在两个不同的过程中,AsyncTask必须根据android doc在主UI线程中执行,所以我为什么试图根据这些事实,在我看来,这似乎是不可能的。

如果我错了,请有人纠正我。

也许问题不是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"); } } 

是否有可能在Service类中使用AsyncTask?

是。 请参阅Reto Meier(2010) 专业Android 2应用程序开发 Wrox。 Meier 发布了支持代码 (参见第9章地震4 / src / com / paad / earthquake / 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中执行才有效 ”(虽然这会违反线程规则 )。

虽然可以在Service类中使用AsyncTask ,但这违反了线程规则 ,特别是,必须在UI线程上实例化和调用AsyncTask 。 (请参阅https://stackoverflow.com/a/25172977/3664487进一步讨论。&#xFF09;