Этот класс AsyncTask должен быть статическим, иначе через YouTubeExtractor могут возникнуть утечки - PullRequest
1 голос
/ 13 апреля 2019

Я использую Библиотека извлечения Youtube

implementation 'com.github.HaarigerHarald:android-youtubeExtractor:master-SNAPSHOT'

Я использую это для получения URL-адреса загрузки YouTube в моем фрагменте, который загружается в мою базу данных Firebase, как только он заканчивает извлекать

if (requestCode==0000 && resultCode==getActivity().RESULT_OK){

            if (videoPath != null ) {
                for (String s : videoPath) {

                    new YouTubeExtractor(context) { // THIS LIBRARY SHOWING WARNING
                        @Override
                        protected void onExtractionComplete(SparseArray<YtFile> ytFiles, VideoMeta videoMeta) {
                            if (ytFiles !=null){
                                int itag = 18;
                                String link = ytFiles.get(18).getUrl();

                                Map<String, Object> map = new HashMap<>();
                                map.put("Message", link);

                                String Temp_Key = databaseReference.push().getKey();
                                Map<String, Object> RoomKey = new HashMap<>();
                                databaseReference.updateChildren(RoomKey);
                                DatabaseReference message_Root = databaseReference.child(Temp_Key);
                                message_Root.updateChildren(map);

                            }
                        }

                    }.extract(s, true, true);

                }
            }

Мой вопрос заключается в том, как решить это предупреждение с помощью этой библиотеки. Я не хочу использовать @SuppressLint("StaticFieldLeak"), который только подавляет предупреждение, но не разрешает его.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

YouTubeExtractor уже использует WeakReference под капотом, чтобы избежать утечки вашего контекста (активность, сервис и т. Д.). Таким образом, вы можете использовать @SuppressLint("StaticFieldLeak") для удаления предупреждения.

Существует еще одно решение - создание класса, который выходит из YouTubeExtractor.

static class MyYoutubeExtractor extends YouTubeExtractor {
    MyYoutubeExtractor(@NonNull Context con) {
        super(con);
    }

    @Override
    protected void onExtractionComplete(SparseArray<YtFile> ytFiles, VideoMeta videoMeta) {
        if (ytFiles != null) {
            int itag = 18;
            String link = ytFiles.get(18).getUrl();

            Map<String, Object> map = new HashMap<>();
            map.put("Message", link);

            String Temp_Key = databaseReference.push().getKey();
            Map<String, Object> RoomKey = new HashMap<>();
            databaseReference.updateChildren(RoomKey);
            DatabaseReference message_Root = databaseReference.child(Temp_Key);
            message_Root.updateChildren(map);
        }
    }
}

Затем, используя его

new MyYoutubeExtractor(context).extract("", true, true);
0 голосов
/ 13 апреля 2019

Чтобы избежать утечки памяти, вам нужно создать недельную ссылку на активность / фрагмент в AsyncTask; и здесь - полное объяснение этого с примером кода ниже

public class MyActivity extends AppCompatActivity {

int mSomeMemberVariable = 123;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // start the AsyncTask, passing the Activity context
    // in to a custom constructor 
    new MyTask(this).execute();
}

private static class MyTask extends AsyncTask<Void, Void, String> {

    private WeakReference<MyActivity> activityReference;

    // only retain a weak reference to the activity 
    MyTask(MyActivity context) {
        activityReference = new WeakReference<>(context);
    }

    @Override
    protected String doInBackground(Void... params) {

        // do some long running task...

        return "task finished";
    }

    @Override
    protected void onPostExecute(String result) {

        // get a reference to the activity if it is still there
        MyActivity activity = activityReference.get();
        if (activity == null || activity.isFinishing()) return;

        // modify the activity's UI
        TextView textView = activity.findViewById(R.id.textview);
        textView.setText(result);

        // access Activity member variables
        activity.mSomeMemberVariable = 321;
    }
}

}

Также существуют другие альтернативы AsyncTask, такие как Executor и AsyncTaskLoader , о которых вы можете подумать вместо этого. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...