使用RecyclerView

时间:2017-03-17 15:27:56

标签: android android-youtube-api leakcanary

我有一张RecyclerView,其中包含图片和YouTube缩略图列表。如果用户点击YouTube缩略图,则会打开一个新活动,在上半部分显示嵌入的YouTube视频(使用YouTube Android Player API片段),并在下半部分显示说明,标题等。

我的问题是,无论我如何尝试实施YouTube Android Player API,Android Studio&当我按下后退按钮返回RecyclerView时,Leak Canary将始终显示泄漏。我对LeakCanary很新,而且整个Android都在发展。如果有任何更多细节我可以提供泄漏,请告诉我,我将编辑此帖子以包含它。

我已经尝试了很多方法来实现这一点,同时也提出YouTube建议,YouTubePlayerFragmentYouTubePlayerView。此时,我不知道还能做什么。这只发生在我使用YouTube API时,如果我只是显示图片,我的Activity不会泄漏。非常感谢任何帮助,我准备好把头发拉出来。

LeakCanary

YouTubePlayerActivity是我的班级,不在YouTube API。此外,扩展任何LeakCanary跟踪都不会显示任何细节。

Youtube Leak Canary

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>

1 个答案:

答案 0 :(得分:0)

尝试在PlayerYouTubeFrag代码中添加以下行:

@Override
public void onDetach() {
    super.onDetach();
    activePlayer.release();
    activePlayer = null;
}