Android 在远程服务中使用异步任务
我在使用服务和其中的异步任务时遇到了一个小问题。我编写了一个小类,它执行一些HTTP内容,它执行一个AsyncTask来在后台执行所有HTTP工作,当它完成时,用响应数据调用一个侦听器 现在,我需要在服务(远程服务)中使用该类,每次该类尝试从AsyncTask类创建对象时,它都会崩溃,并在日志中显示以下消息: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
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));
}
};
[...]
}