AsynchTask зависает во время работы обработчика postDelayed - PullRequest
0 голосов
/ 06 января 2020

Я довольно новичок в разработке приложений, но у меня есть проблема, которую я не могу понять.

У меня есть экран spla sh, который я использую для загрузки различных вещей, которые должны работать в приложении (файлы конфигурации, html из inte rnet), и последний доставляет мне огромную проблему , Вот код

Document doc = null;

protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splash);

        //Fix loading data, dunno why this happens
        try {
            doc = new getHtml().get();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        /* New Handler to start the Menu-Activity
         * and close this Splash-Screen after some seconds.*/
        new Handler().postDelayed(new Runnable(){
            @Override
            public void run() {
                /* Create an Intent that will start the Menu-Activity. */
                Utils.saveData(Splash.this, doc);
                Intent mainIntent = new Intent(Splash.this, PocketFrameNavigation.class);
                Splash.this.startActivity(mainIntent);
                Splash.this.finish();
            }
        }, SPLASH_DISPLAY_LENGTH);
    }

public static class getHtml extends AsyncTask<Void, Void, Document> {

        protected Document doInBackground(Void... args) {
            try {
                return Jsoup.connect(DROP_DATA_URL).get();
            } catch(Exception e) {
                return null;
            }
        }

        protected void onPostExecute(Document html){
            doc = html;
        }
    }

Код, который вызывает у меня проблему, находится внутри оператора try. Вроде бы заморозил основной поток, где бы я его ни ставил. Есть ли что-то, что я делаю ужасно неправильно? Заранее благодарим за помощь.

Кроме того, функция get HTML работает, когда не задействован обработчик с отложенной задержкой. так что я думаю, что это как-то связано с этим.

1 Ответ

1 голос
/ 06 января 2020

Я думаю, что будет работать:

    Document doc = null;

        protected void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.splash);

            new GetHTMLContent().excute();


        }

        private static class GetHTMLContent extends AsyncTask<Void, Void, Document> {

            protected Document doInBackground(Void... args) {
                try {
                    return Jsoup.connect(DROP_DATA_URL).get();
                } catch(Exception e) {
                    return null;
                }
            }

            protected void onPostExecute(Document html){
                doc = html;
                Utils.saveData(Splash.this, doc);
                goToMainActivity();


            }
        }

        private void goToMainActivity(){
            new Handler().postDelayed(new Runnable(){
                @Override
                public void run() {
                    /* Create an Intent that will start the Menu-Activity. */
                    Intent mainIntent = new Intent(Splash.this, PocketFrameNavigation.class);
                    Splash.this.startActivity(mainIntent);
                    Splash.this.finish();
                }
            }, SPLASH_DISPLAY_LENGTH);
        }

}
...