Android 在远程服务中使用异步任务

Android 在远程服务中使用异步任务,android,android-asynctask,android-service,Android,Android Asynctask,Android Service,我在使用服务和其中的异步任务时遇到了一个小问题。我编写了一个小类,它执行一些HTTP内容,它执行一个AsyncTask来在后台执行所有HTTP工作,当它完成时,用响应数据调用一个侦听器 现在,我需要在服务(远程服务)中使用该类,每次该类尝试从AsyncTask类创建对象时,它都会崩溃,并在日志中显示以下消息: 05-07 10:30:01.847: E/JavaBinder(1026): *** Uncaught remote exception! (Exceptions are not ye

我在使用服务和其中的异步任务时遇到了一个小问题。我编写了一个小类,它执行一些HTTP内容,它执行一个AsyncTask来在后台执行所有HTTP工作,当它完成时,用响应数据调用一个侦听器

现在,我需要在服务(远程服务)中使用该类,每次该类尝试从AsyncTask类创建对象时,它都会崩溃,并在日志中显示以下消息:

05-07 10:30:01.847: E/JavaBinder(1026): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
05-07 10:30:01.847: E/JavaBinder(1026): java.lang.ExceptionInInitializerError
05-07 10:30:01.847: E/JavaBinder(1026):     at com.lowlevel.umusic.VK.getById(VK.java:46)
05-07 10:30:01.847: E/JavaBinder(1026):     at com.lowlevel.umusic.Song.requestUri(Song.java:109)
05-07 10:30:01.847: E/JavaBinder(1026):     at com.lowlevel.umusic.PlayService$1.playSong(PlayService.java:149)
05-07 10:30:01.847: E/JavaBinder(1026):     at com.lowlevel.umusic.IPlayService$Stub.onTransact(IPlayService.java:55)
05-07 10:30:01.847: E/JavaBinder(1026):     at android.os.Binder.execTransact(Binder.java:320)
05-07 10:30:01.847: E/JavaBinder(1026):     at dalvik.system.NativeStart.run(Native Method)
05-07 10:30:01.847: E/JavaBinder(1026): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-07 10:30:01.847: E/JavaBinder(1026):     at android.os.Handler.<init>(Handler.java:121)
05-07 10:30:01.847: E/JavaBinder(1026):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
05-07 10:30:01.847: E/JavaBinder(1026):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
05-07 10:30:01.847: E/JavaBinder(1026):     at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
05-07 10:30:01.847: E/JavaBinder(1026):     ... 6 more
05-07 10:30:01.847: W/dalvikvm(1026): threadid=8: thread exiting with uncaught exception (group=0x40015560)
05-07 10:30:01.847: E/AndroidRuntime(1026): FATAL EXCEPTION: Binder Thread #2
05-07 10:30:01.847: E/AndroidRuntime(1026): java.lang.ExceptionInInitializerError
05-07 10:30:01.847: E/AndroidRuntime(1026):     at com.lowlevel.umusic.VK.getById(VK.java:46)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at com.lowlevel.umusic.Song.requestUri(Song.java:109)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at com.lowlevel.umusic.PlayService$1.playSong(PlayService.java:149)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at com.lowlevel.umusic.IPlayService$Stub.onTransact(IPlayService.java:55)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at android.os.Binder.execTransact(Binder.java:320)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at dalvik.system.NativeStart.run(Native Method)
05-07 10:30:01.847: E/AndroidRuntime(1026): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-07 10:30:01.847: E/AndroidRuntime(1026):     at android.os.Handler.<init>(Handler.java:121)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
05-07 10:30:01.847: E/AndroidRuntime(1026):     at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
05-07 10:30:01.847: E/AndroidRuntime(1026):     ... 6 more
05-07 10:30:01.847:E/JavaBinder(1026):***未捕获的远程异常!(尚未跨流程支持异常。)
05-07 10:30:01.847:E/JavaBinder(1026):java.lang.Exception初始化错误
05-07 10:30:01.847:E/JavaBinder(1026):位于com.lowlevel.umusic.VK.getById(VK.java:46)
05-07 10:30:01.847:E/JavaBinder(1026):位于com.lowlevel.umusic.Song.requestUri(Song.java:109)
05-07 10:30:01.847:E/JavaBinder(1026):在com.lowlevel.umusic.PlayService$1.playSong(PlayService.java:149)
05-07 10:30:01.847:E/JavaBinder(1026):位于com.lowlevel.umusic.IPlayService$Stub.onTransact(IPlayService.java:55)
05-07 10:30:01.847:E/JavaBinder(1026):在android.os.Binder.execTransact(Binder.java:320)
05-07 10:30:01.847:E/JavaBinder(1026):在dalvik.system.NativeStart.run(本机方法)
05-07 10:30:01.847:E/JavaBinder(1026):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
05-07 10:30:01.847:E/JavaBinder(1026):位于android.os.Handler.(Handler.java:121)
05-07 10:30:01.847:E/JavaBinder(1026):位于android.os.AsyncTask$InternalHandler。(AsyncTask.java:421)
05-07 10:30:01.847:E/JavaBinder(1026):位于android.os.AsyncTask$InternalHandler。(AsyncTask.java:421)
05-07 10:30:01.847:E/JavaBinder(1026):位于android.os.AsyncTask.(AsyncTask.java:152)
05-07 10:30:01.847:E/JavaBinder(1026):。。。还有6个
05-07 10:30:01.847:W/dalvikvm(1026):threadid=8:线程以未捕获异常退出(组=0x40015560)
05-07 10:30:01.847:E/AndroidRuntime(1026):致命异常:活页夹螺纹#2
05-07 10:30:01.847:E/AndroidRuntime(1026):java.lang.ExceptionInInitializeError
05-07 10:30:01.847:E/AndroidRuntime(1026):位于com.lowlevel.umusic.VK.getById(VK.java:46)
05-07 10:30:01.847:E/AndroidRuntime(1026):位于com.lowlevel.umusic.Song.requestUri(Song.java:109)
05-07 10:30:01.847:E/AndroidRuntime(1026):在com.lowlevel.umusic.PlayService$1.playSong(PlayService.java:149)
05-07 10:30:01.847:E/AndroidRuntime(1026):在com.lowlevel.umusic.IPlayService$Stub.onTransact(IPlayService.java:55)
05-07 10:30:01.847:E/AndroidRuntime(1026):在android.os.Binder.execTransact(Binder.java:320)上
05-07 10:30:01.847:E/AndroidRuntime(1026):在dalvik.system.NativeStart.run(本机方法)
05-07 10:30:01.847:E/AndroidRuntime(1026):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
05-07 10:30:01.847:E/AndroidRuntime(1026):在android.os.Handler.(Handler.java:121)
05-07 10:30:01.847:E/AndroidRuntime(1026):位于android.os.AsyncTask$InternalHandler。(AsyncTask.java:421)
05-07 10:30:01.847:E/AndroidRuntime(1026):位于android.os.AsyncTask$InternalHandler。(AsyncTask.java:421)
05-07 10:30:01.847:E/AndroidRuntime(1026):在android.os.AsyncTask.(AsyncTask.java:152)
05-07 10:30:01.847:E/AndroidRuntime(1026):。。。还有6个
有什么想法吗?否则我必须修改我的类以同步工作

谢谢

公共类登录服务\u服务扩展服务{
public class LoginService_Service extends Service {
    NotificationManager mNM;
    static String stcode="";

    @Override
    public void onCreate() {
        mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        new DoLogin().execute(null);
    }
    @Override
    public void onDestroy() {
        mNM.cancel(R.string.notify_cancel);
        Log.i("Finish", "OnDestroy Called");
    }

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

    private final IBinder mBinder = new Binder() {
        @Override
        protected boolean onTransact(int code, Parcel data, Parcel reply,
                int flags) throws RemoteException {
            return super.onTransact(code, data, reply, flags);
        }
    };
    public class DoLogin extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            HttpClient client = new DefaultHttpClient();
            HttpConnectionParams
                    .setConnectionTimeout(client.getParams(), 10000); // Timeout
            try {
                HttpPost request = new HttpPost(
                        "myurl");
                JSONStringer jsonstr = new JSONStringer().object().key(
                "UserName").value(prefs.getString("unm", "")).key(
                "Password").value(prefs.getString("pwd", ""))
                .endObject();

                Log.i("JSONStringer", jsonstr.toString());
                StringEntity entity = new StringEntity(jsonstr.toString());
                entity.setContentType("application/json;charset=UTF-8");// text/plain;charset=UTF-8
                entity
                        .setContentEncoding(new BasicHeader(
                                HTTP.CONTENT_TYPE,
                                "application/json;charset=UTF-8"));
                request.setEntity(entity);
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpResponse res = httpClient.execute(request);
                Log.i("Request", request.toString());
            } catch (Exception e) {
                e.printStackTrace();
                Log.i("Error", "Cannot Estabilish Connection");
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if (stcode != null) {
                if (stcode.equalsIgnoreCase("0")) {
                    Log.i("ReLogin", "ReLogin Success");
                } else {
                    Log.i("ReLogin", "ReLogin Failed");
                }
            }
            LoginService_Service.this.stopSelf();
        }

    }
}
通知经理mNM; 静态字符串stcode=“”; @凌驾 public void onCreate(){ mNM=(NotificationManager)getSystemService(通知服务); 新的DoLogin().execute(null); } @凌驾 公共空间{ mNM.cancel(R.string.notify\u cancel); Log.i(“完成”,“调用OnDestroy”); } @凌驾 公共IBinder onBind(意向){ 返回mBinder; } 专用最终IBinder mBinder=新活页夹(){ @凌驾 受保护的布尔onTransact(整数代码、包裹数据、包裹回复、, int标志)引发RemoteException{ 返回super.onTransact(代码、数据、回复、标志); } }; 公共类DoLogin扩展异步任务{ @凌驾 受保护的Void doInBackground(Void…参数){ HttpClient=new DefaultHttpClient(); HttpConnectionParams .setConnectionTimeout(client.getParams(),10000);//超时 试一试{ HttpPost请求=新建HttpPost( “myurl”); JSONStringer jsonstr=新建JSONStringer().object().key( “UserName”).value(prefs.getString(“unm”和“”).key( “Password”).value(prefs.getString(“pwd”和“”) .endObject(); i(“JSONStringer”,jsonstr.toString()); StringEntity=新的StringEntity(jsonstr.toString()); entity.setContentType(“application/json;charset=UTF-8”);//text/plain;charset=UTF-8 实体 .setContentEncoding(新的基本阅读器)( HTTP.CONTENT\u类型, “application/json;charset=UTF-8”); 请求。设置实体(实体); DefaultHttpClient httpClient=新的DefaultHttpClient(); HttpResponse res=httpClient.execute(请求); Log.i(“Request”,Request.toString()); }捕获(例外e){ e、 printStackTrace(); Log.i(“错误”,“无法建立连接”); } 返回null; } @凌驾 受保护的void onPostExecute(void结果){ super.onPostExecute(结果); if(stcode!=null){ if(stcode.equalsIgnoreCase(“0”)){ Log.i(“重新登录”、“重新登录”
public class MyService extends Service {
    private static final int MSG_CALLTASK = 0;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MSG_CALLTASK:
                new MyAsyncTask().execute();
                break;
            }
        }
    };

    private IMyService.Stub mStub = new IMyService.Stub = {
        public void myFunction() {
            /* Call task */
            mHandler.sendMessage(mHandler.obtainMessage(MSG_CALLTASK));
        }
    };

    [...]
}