- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试在 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/
我使用这个类来扫描我在 SDCard 中的应用图像。 public class SingleMediaScanner implements MediaScannerConnectionClient {
首先,我已经在此处的一些线程中阅读了这个问题,并且我知道可以用应用程序上下文替换 getActivity() 来解决这个问题。所有这些答案都是几年前的,现在我认为它不支持应用程序上下文,因为当我放置应
我在我的应用程序中添加了几个按钮并再次运行它,但它在完成一次运行后崩溃了。我不确定是什么导致了它,但这是 Debug模式下的以下错误: 06-20 23:21:59.656 2323-2323/
我正在使用 API Demos 中的 MediaScannerConnection 示例代码 我使用的 fragment 是: MediaScannerConnection.scanFile(
我在没有任何服务器帮助的情况下直接连接 mysql 数据库。当我尝试使用模拟器连接 mysql 时,它工作正常。但是当我使用我的手机时,它会抛出一些异常。我不知道是什么问题。请帮我解决这个问题。 这是
我正在尝试构建一个简单的 android 应用程序,其中包含一个 Activity ,上面有两个按钮,两个按钮带有 setOnClickListener 方法。但是当尝试在模拟器中运行 android
它失败了@ below line - bindService(intent, m_serviceConnection, Context.BIND_AUTO_CREATE); 下面是轨迹.... Act
我是一名优秀的程序员,十分优秀!