- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更新:
我刚刚在另一台设备上测试了我的应用程序,发现我在运行 Android 4.4.2 的 Nexus 4 上确实遇到了错误,但在运行 Android 4.0.4 的 Desire S 上没有。他们都安装了当前的 YouTube 应用程序 (5.3.32),这是使用 API 所必需的。
问题:为什么我会收到这些 ServiceConnectionLeaked 消息?(请参阅下面的 Logcat)
描述:
我正在使用 YouTube Android Player API 1.0.0 ( https://developers.google.com/youtube/android/player/ ) 通过以下适配器代码在 ListView 中加载视频缩略图:
private final Map<View, YouTubeThumbnailLoader> mThumbnailViewToLoaderMap;
public ListViewAdapter(Activity activity, int layoutId, List<Suggestion> suggestions) {
super(activity, layoutId, suggestions);
mThumbnailViewToLoaderMap = new HashMap<View, YouTubeThumbnailLoader>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
String videoId = getYoutubeId();
// There are three cases here...
if (convertView == null) {
convertView = LayoutInflater.from(mActivity).inflate(R.layout.row_suggestion, parent, false);
holder = new ViewHolder();
holder.thumbnailView = (YouTubeThumbnailView) convertView.findViewById(R.id.youtubeThumbnail);
// ... case 1: The youtube view has not yet been created - we need to initialize the YouTubeThumbnailView.
holder.thumbnailView.setLayoutParams(mThumbnailLayoutParams);
holder.thumbnailView.setTag(videoId);
holder.thumbnailView.initialize(DeveloperKey.DEVELOPER_KEY, this);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
// ... case 2 & 3 The view is already created and...
YouTubeThumbnailLoader loader = mThumbnailViewToLoaderMap.get(holder.thumbnailView);
// ... is currently being initialized. We store the current videoId in the tag.
if (loader == null) {
holder.thumbnailView.setTag(videoId);
// ... already initialized. Simply set the right videoId on the loader.
} else {
loader.setVideo(videoId);
}
}
holder.thumbnailView.setImageResource(R.drawable.thumbnail_loading);
return convertView;
}
@Override
public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader youTubeThumbnailLoader) {
String videoId = (String) youTubeThumbnailView.getTag();
mThumbnailViewToLoaderMap.put(youTubeThumbnailView, youTubeThumbnailLoader);
youTubeThumbnailLoader.setOnThumbnailLoadedListener(this);
youTubeThumbnailLoader.setVideo(videoId);
}
public void releaseLoaders() {
for (YouTubeThumbnailLoader loader : mThumbnailViewToLoaderMap.values()) {
loader.release();
}
}
持有此 listView 的 Fragment 具有以下代码:
private ListViewAdapter listViewAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = (ViewGroup) inflater.inflate(R.layout.fragment_search_results, container, false);
listView = (ListView) rootView.findViewById(R.id.suggestion_list);
// see if there is already an adapter
// and use it as our adapter (e.g. after device rotation)
if (listViewAdapter != null) {
listView.setAdapter(listViewAdapter);
}
return rootView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
mListViewAdapter.releaseLoaders();
}
这是发生了什么:
现在我第一次旋转设备(假设是横向):
因此这会生成一个缩略图列表,这些缩略图交替正确加载和根本不加载。现在,我将设备旋转第二次(回到纵向):
现在我第三次旋转设备(我们再次处于之前错误的横向):
所以只有在设备第一次旋转后才会发生一些事情,所以可见的缩略图不会加载到它们的列表项中。
第一次轮换后,logcat 会针对每个缩略图请求显示以下消息:
03-09 17:43:08.770 30446-30446/com.mypackage.name E/ActivityThread: Activity com.mypackage.name.activities.SearchActivity has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@41b0a6c0 that was originally bound here android.app.ServiceConnectionLeaked: Activity com.mypackage.name.activities.SearchActivity has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@41b0a6c0 that was originally bound here at android.app.LoadedApk$ServiceDispatcher.(LoadedApk.java:1041) at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:935) at android.app.ContextImpl.bindServiceAsUser(ContextImpl.java:1692) at android.app.ContextImpl.bindService(ContextImpl.java:1680) at android.content.ContextWrapper.bindService(ContextWrapper.java:496) at com.google.android.youtube.player.internal.r.e(Unknown Source) at com.google.android.youtube.player.YouTubeThumbnailView.initialize(Unknown Source) at com.mypackage.name.adapters.ListViewAdapter.getView(ListViewAdapter.java:94) at com.mypackage.name.views.ListView.obtainView(ListView.java:1285) at com.mypackage.name.views.ListView.fillDown(ListView.java:1046) at com.mypackage.name.views.ListView.populate(ListView.java:720) at com.mypackage.name.views.ListView.onLayout(ListView.java:677) at android.view.View.layout(View.java:14520) at android.view.ViewGroup.layout(ViewGroup.java:4604) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077) at android.view.View.layout(View.java:14520) at android.view.ViewGroup.layout(ViewGroup.java:4604) at android.widget.FrameLayout.onLayout(FrameLayout.java:448) ...
为什么我会收到这些 ServiceConnectionLeaked 消息?
我已经四处搜索,在大多数情况下,需要进行某种 API 初始化,其中必须提供应用程序上下文而不是 Activity 上下文。但是 YouTubePlayer Android API 没有这样的初始化(至少在我的代码部分没有)。
最佳答案
我终于找到了解决方案。我跟踪了第一次创建所有 vie 和 fragment 时发生的每一个步骤,并将其与第一次轮换期间发生的情况进行了比较。记下创建和重新使用的每个对象,我发现在 fragment 的 onCreateView-Method 期间我重新启动了 listView,但将旧适配器设置为它。到目前为止,这不是问题,也是 afaik 的良好做法,因为我可以重新使用适配器持有的所有信息(如果我错了,请纠正我)。
问题存在于早期的适配器初始化中。适配器在第一次旋转之前初始化,并将当前 Activity 作为其上下文。因此,在旋转之后,它仍然具有旧的纵向 Activity 作为上下文,尽管它位于新创建的横向 Activity 中。 => 经典 Activity 泄漏。
YoutubeThumbnail-initializer 似乎使用了这个上下文,尽管没有关于此的提示或文档。因此,当我使用应用程序上下文初始化适配器时,此应用程序上下文用于 YouTubeThumbnails,不会产生泄漏。
关于android - 在 ListView : Activity has leaked ServiceConnection <youtube. player.internal> 原来绑定(bind)在这里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285129/
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!