gpt4 book ai didi

android - Android中的ServiceConnectionLeaked

转载 作者:IT老高 更新时间:2023-10-28 23:21:59 30 4
gpt4 key购买 nike

我正在尝试在 Android 中使用 Service 进行一些基本的数据库操作,但由于某种原因,我收到了 Activity has leaked ServiceConnection 错误。我将在底部发布完整的 Logcat 读数。

我必须在多个 Activity 中使用相同的服务,所以我创建了一个父类(super class)来处理所有的服务任务。它看起来像这样:

private MyInterface child;

public void onCreate(Bundle savedInstanceState, MyInterface child){
super.onCreate(savedInstanceState);

doBindService();
}

public void onResume(){
super.onResume();

doBindService();
}

protected void onPause(){
super.onPause();

doUnbindService();
}

private boolean bound;
private boolean binding;

ServiceConnection Connection = new ServiceConnection(){

//called when the service is connected
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(LOGTAG, "Bound to Service");
bound = true;
binding = false;
toServiceMessenger = new Messenger(service);
while(!commandsForService.isEmpty()){
sendToService(commandsForService.poll());
}
}

//called when the service is disconnected
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(LOGTAG, "Unboud from Service");
bound = false;
binding = false;
toServiceMessenger = null;
}
};

private boolean doBindService(){
Log.d(LOGTAG, "Attempting to Bind to Service");
if(!bound && !binding){
binding = true;
bindService(new Intent(this, global.FetchService.class), Connection, Context.BIND_AUTO_CREATE);
}
return bound;
}

private void doUnbindService(){
Log.d(LOGTAG, "Attempting to Unbind from Service");
if(bound && !binding){
binding = true;
unbindService(Connection);
}
}

public void sendToService(Message msg){
if(bound){
sendMessageToService(msg);
}
else{
commandsForService.add(msg);
}
}

private void sendMessageToService(Message msg){
if(bound){
msg.replyTo = fromServiceMessenger;
try {
toServiceMessenger.send(msg);
} catch (RemoteException e) {
Log.d(LOGTAG, "RemoteException communicating with service");
}
}
else{
Log.d(LOGTAG, "Error: toServiceMessenger null while bound");
}
}

这个想法是子 Activity 永远不需要担心是否连接到服务,父类(super class)应该负责将数据获取到服务并返回给子 Activity 。

logcat在onCreate()中指向doBindService() --> bindService(new Intent(this, global.FetchService.class), Connection, Context.BIND_AUTO_CREATE);作为导致错误的行。但是,该服务仅在 Activity 运行且可见时间超过 15 秒后才会泄漏,因此我认为不应调用 onCreate()。

这是 Logcat:

09-02 09:25:40.635: E/ActivityThread(5963): Activity childActivity has leaked ServiceConnection superClass$1@42cb1b70 that was originally bound here
09-02 09:25:40.635: E/ActivityThread(5963): android.app.ServiceConnectionLeaked: Activity childActivity has leaked ServiceConnection superClass$1@42cb1b70 that was originally bound here
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1055)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:949)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ContextImpl.bindService(ContextImpl.java:1472)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ContextImpl.bindService(ContextImpl.java:1464)
09-02 09:25:40.635: E/ActivityThread(5963): at android.content.ContextWrapper.bindService(ContextWrapper.java:394)
09-02 09:25:40.635: E/ActivityThread(5963): at superClass.doBindService(FetchActivity.java:253)
09-02 09:25:40.635: E/ActivityThread(5963): at superClass.onCreate(FetchActivity.java:61)
09-02 09:25:40.635: E/ActivityThread(5963): at childActivity.onCreate(Showcase_Activity.java:37)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.Activity.performCreate(Activity.java:5066)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.access$600(ActivityThread.java:151)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335)
09-02 09:25:40.635: E/ActivityThread(5963): at android.os.Handler.dispatchMessage(Handler.java:99)
09-02 09:25:40.635: E/ActivityThread(5963): at android.os.Looper.loop(Looper.java:155)
09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.main(ActivityThread.java:5493)
09-02 09:25:40.635: E/ActivityThread(5963): at java.lang.reflect.Method.invokeNative(Native Method)
09-02 09:25:40.635: E/ActivityThread(5963): at java.lang.reflect.Method.invoke(Method.java:511)
09-02 09:25:40.635: E/ActivityThread(5963): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
09-02 09:25:40.635: E/ActivityThread(5963): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795)
09-02 09:25:40.635: E/ActivityThread(5963): at dalvik.system.NativeStart.main(Native Method)

任何帮助将不胜感激。

最佳答案

当您在 onCreate() 中调用 doBindService() 时,您应该在 onDestroy 中添加 do UnbindService() ().

它对我有用。

关于android - Android中的ServiceConnectionLeaked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18575903/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com