使用AsyncTask时我的屏幕方向有问题,即使它在服务中也是如此 我的服务看起来像:
public class RequestService extends Service {
private MyBinder binder;
public RequestService(){
binder = new MyBinder(RequestService.this);
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public class MyBinder extends Binder{
private final RequestService service;
public MyBinder(RequestService service){
this.service = service;
}
public RequestService getService(){
return this.service;
}
}
public <T> void sendRequest(Request<T> task, INotifyRequest<T> notify){
// Call excute the asynctask and notify result in onPostExcute
new TaskExecutor<T>(task, notify).execute();
}
}
更新:我使用我的服务:
// start the service
final Intent intent = new Intent(context, serviceClass);
context.startService(intent);
// then bound the service:
final Intent intentService = new Intent(context, serviceClass);
// Implement the Service Connection
serviceConnection = new RequestServiceConnection();
context.getApplicationContext().bindService(intentService, serviceConnection,
Context.BIND_AUTO_CREATE);
当方向更改时,服务将解除绑定,然后重新绑定,AsyncTask
不会通知更新UI。 我想知道为什么在AsyncTask
内会发生Service
?
我已阅读this post,但我不想锁定屏幕方向或类似的东西。我更喜欢Service
而不是IntentService
作为Service
的灵活性,我可以将它与Binder一起使用来获取Service实例。
所以,问题是,有没有办法在Service
而不是AsyncTask
内做线程安全?
答案 0 :(得分:0)
如果您使用绑定服务,请记住,如果没有绑定Activity,将销毁该服务。我不知道你是否在onPause()中取消绑定,但这会在方向更改时破坏你的服务。
因此,您将失去服务和对AsyncTask的引用。此外,没有onRetainInstanceState()可用于服务,以保存AsyncTask并再次获取它。
在这种情况下考虑一个IntentService,这将是正确的方法。或者,如果您希望保持服务使用startService(),以保持活动状态,而不绑定任何活动。然后,您仍然可以按照自己的方式绑定和取消绑定服务。
下一步是保留AsyncTask的引用。因为如果活动被销毁,您必须再次设置回调。因为回调引用仍将设置为旧的Activity。
希望这有帮助。
编辑:
好吧,如果你读过,也许你考虑使用IntentService或其他东西..
在服务中保留AsyncTask的实例,并在任务中为回调定义一个setter。 如果您的活动在方向更改检查后绑定到服务,则AsyncTask是否正在运行。如果它正在运行更新回调。你可以使用你的Binder。