是否可以在服务类中使用AsyncTask?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

一切都在标题中。

在官方文档中指出,Note that services, like other application objects, run in the main thread of their hosting processAsyncTask只有在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()

我做错了什么或者这是不可能的?

这是我的Service类的代码

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()", "");
        }

    }
}
提问于
用户回答回答于

我想我发现为什么它不适合我的情况。

我在这里使用这个:

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,Inter Process Communication,所以我想我的Service和我的Activity在两个不同的过程中,AsyncTask必须根据android doc在主UI线程中执行,所以我为什么要尝试根据这些事实,对我来说做事似乎是不可能的。

用户回答回答于

另外一定要检查出IntentService。如果这个类足够满足你的需求,它将处理很多涉及使这个模式正常工作的小细节。

扫码关注云+社区