服务中的AsyncTask:处理屏幕方向

时间:2013-07-31 15:22:24

标签: android android-asynctask android-service

使用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内做线程安全?

1 个答案:

答案 0 :(得分:0)

如果您使用绑定服务,请记住,如果没有绑定Activity,将销毁该服务。我不知道你是否在onPause()中取消绑定,但这会在方向更改时破坏你的服务。

因此,您将失去服务和对AsyncTask的引用。此外,没有onRetainInstanceState()可用于服务,以保存AsyncTask并再次获取它。

在这种情况下考虑一个IntentService,这将是正确的方法。或者,如果您希望保持服务使用startService(),以保持活动状态,而不绑定任何活动。然后,您仍然可以按照自己的方式绑定和取消绑定服务。

下一步是保留AsyncTask的引用。因为如果活动被销毁,您必须再次设置回调。因为回调引用仍将设置为旧的Activity。

希望这有帮助。

编辑:

好吧,如果你读过,也许你考虑使用IntentService或其他东西..

在服务中保留AsyncTask的实例,并在任务中为回调定义一个setter。 如果您的活动在方向更改检查后绑定到服务,则AsyncTask是否正在运行。如果它正在运行更新回调。你可以使用你的Binder。