0

使用 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
我已经阅读了这篇文章,但我不想锁定屏幕方向或类似的东西。我更喜欢Servicethan IntentServiceasService的灵活,我可以将它与 Binder 一起使用来获取 Service 实例。
所以,问题是,有没有办法在Service而不是里面做线程安全AsyncTask

4

1 回答 1

0

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

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

在这种情况下考虑 IntentService 将是正确的方法。或者,如果您想保留服务,请使用 startService(),以便在没有绑定 Activity 时使其保持活动状态。然后您仍然可以按照您想要的方式绑定和取消绑定服务。

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

希望这可以帮助。

编辑:

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

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

于 2013-07-31T16:00:25.013 回答