我有一张RecyclerView
,其中包含图片和YouTube缩略图列表。如果用户点击YouTube缩略图,则会打开一个新活动,在上半部分显示嵌入的YouTube视频(使用YouTube Android Player API
片段),并在下半部分显示说明,标题等。
我的问题是,无论我如何尝试实施YouTube Android Player API
,Android Studio&当我按下后退按钮返回RecyclerView
时,Leak Canary将始终显示泄漏。我对LeakCanary
很新,而且整个Android都在发展。如果有任何更多细节我可以提供泄漏,请告诉我,我将编辑此帖子以包含它。
我已经尝试了很多方法来实现这一点,同时也提出YouTube
建议,YouTubePlayerFragment
和YouTubePlayerView
。此时,我不知道还能做什么。这只发生在我使用YouTube API
时,如果我只是显示图片,我的Activity
不会泄漏。非常感谢任何帮助,我准备好把头发拉出来。
LeakCanary
YouTubePlayerActivity
是我的班级,不在YouTube API
。此外,扩展任何LeakCanary
跟踪都不会显示任何细节。
RecyclerView
这是我的onBindViewHolder()
,我设置onClickListener()
,打开我的YouTubePlayerActivity
。
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent youtubeIntent = new Intent(context,YouTubePlayerActivity.class);
Bundle bundle = new Bundle();
bundle.putString("foo", object.getUrl());
bundle.putString("foo1", object.getDescription());
youtubeIntent.putExtras(bundle);
context.startActivity(youtubeIntent, bundle);
}
});
YouTubePlayerActivity.class
我的YouTube播放器所在类的精简版。这是我尝试实施它的许多方法中的最后一种。然而,无论我如何尝试实施,都存在泄漏。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.detail_main_youtube);
Bundle bundle = getIntent().getExtras();
url = bundle.getString("foo");
description = bundle.getString("foo1");
TextView detailDescription = (TextView) findViewById(R.id.txt_detail_description_youtube);
detailDescription.setText(description);
myFragment = PlayerYouTubeFrag.newInstance("Some random YouTube Id");
myTransaction = getFragmentManager().beginTransaction();
myTransaction.addToBackStack(null);
myTransaction.replace(R.id.youtube_fragment, myFragment).commit();
}
PlayerYouTubeFrag
public class PlayerYouTubeFrag extends YouTubePlayerFragment {
private YouTubePlayer activePlayer;
public static PlayerYouTubeFrag newInstance(String youTubeId) {
PlayerYouTubeFrag playerYouTubeFrag = new PlayerYouTubeFrag();
Bundle bundle = new Bundle();
bundle.putString("youTubeId", youTubeId);
playerYouTubeFrag.setArguments(bundle);
playerYouTubeFrag.init();
return playerYouTubeFrag;
}
private void init() {
initialize(Config.YOUTUBE_API_KEY, new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationFailure(YouTubePlayer.Provider arg0, YouTubeInitializationResult arg1) {
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
activePlayer = player;
activePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
if (!wasRestored) {
activePlayer.loadVideo(getArguments().getString("youTubeId"), 0);
}
}
});
}
}
XML布局
这是我YouTubePlayerActivity
的xml框架布局,由片段替换。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/detail_main_youtube"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/backgroundColor">
<FrameLayout
android:id="@+id/youtube_fragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:visibility="visible" />
<ScrollView
android:id="@+id/scroll_view_youtube"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:id="@+id/txt_detail_description_youtube"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="20dp"
android:background="@color/backgroundColor"
android:lineSpacingExtra="5dp"
android:textColor="@color/darkTextColor"
android:textSize="15sp" />
</ScrollView>
</LinearLayout>
答案 0 :(得分:0)
尝试在PlayerYouTubeFrag
代码中添加以下行:
@Override
public void onDetach() {
super.onDetach();
activePlayer.release();
activePlayer = null;
}