Получить строку из асинхронной задачи Android

Как получить строку из AsyncTask? Я использую jsoup для извлечения контента из URL-адреса. В приведенном ниже случае у меня есть содержимое, но мне не удалось поместить его в строку getItembody. Код:

    private String content;
    private static final String HTML_HEADER = "<html><body>";
    private static final String HTML_HEADER = "</body></html>";

    private void SetView(){ 
            contentsWebView.loadData(HTML_HEADER + getItemBody(item) + HTML_FOOTER,
            "text/html", "utf-8");
    }      

    private String getItemBody(Item item) {
        String body = "";
        new LoadContent().execute("");
        return body;
    }

    private class LoadContent extends AsyncTask<String, Integer, String> {
        private ProgressDialog Dialog = new ProgressDialog(
                ViewItemActivity.this);

        @Override
        protected String doInBackground(String... params) {
            String url = "http://inet.detik.com/read/2012/12/21/205518/2124977/398/dosen-unibraw-bikin-aplikasi-pengubah-suara-ketulisan";
            Document doc;
            try {
                doc = Jsoup.connect(url).get();
                Elements element = doc.select(".text_detail");

                String content = element.toString();
                Log.v("LogContentView", content);
            } catch (IOException e) {
                e.printStackTrace();
            }

            return content;
        }

        protected void onPreExecute() {
            Dialog.setMessage("loading content...");
            Dialog.show();
        }

        protected void onPostExecute(Void unused) {
            Dialog.dismiss();
        }
    }

Мой вопрос: я хочу, чтобы содержимое строки из doinbackground помещалось в строку getItemBody, имя строки которой является телом, и я хочу получить результат после закрытия диалога. Текущее диалоговое окно не закрывается само по себе, но должно быть по нажатию клавиши возврата. это результат logcat Log.v("LogContentView", content);

12-27 10:12:10.979: V/LogContentView(2660): <div class="text_detail">
12-27 10:12:10.979: V/LogContentView(2660):  Malang - Indonesia memang memiliki developer aplikasi handal. Salah satunya dibuktikan Eko Sakti, dosen Universitas Brawijaya yang sukses menciptakan aplikasi di Windows Phone yang mampu membuat catatan tanpa harus menulis.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />Never Write -- demikian nama aplikasi tersebut -- bisa dibilang baru di Indonesia. Kemampuannya adalah mengubah 
12-27 10:12:10.979: V/LogContentView(2660):  <em>speech</em> (ucapan) bahasa Inggris menjadi bentuk teks. 
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />Eko mengaku, ide pembuatan aplikasi ini berawal saat mengikuti program Summer School di Bali yang bentuk pengajarannya menggunakan bahasa Inggris.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />&quot;Waktu itu saya ikut Summer School dan dosen yang mengajar menggunakan bahasa Inggris. Saya mencoba mencatat mungkin karena terlalu cepat berbicaranya, banyak yang tertinggal. Setelah di rumah saya coba buka kembali catatan saya, malah tambah bingung,&quot; cerita Eko kepada wartawan di Universitas Brawijaya, Jumat (21/12/2012).
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />Ditambahkannya, aplikasi Never Write bisa diupload di evernote. Selain itu aplikasi ini juga mempunyai kelebihan di antaranya bisa diakses di segala tempat dengan catatan file aplikasi sudah tersimpan pada perangkat genggam.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />Never Write tidak mempunyai batasan dalam memasukkan jumlah kata. Sehingga bisa digunakan sebagai sub title film yang nantinya bisa diubah dalam bahasa Indonesia.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />Sebagai bukti sahih kehebatannya, aplikasi ini pun sukses meraih gelar dalam kompetisi Nokia Lumia Apps Olympiad yang berlangsung dari pertengahan November 2012 lalu.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />Dalam kompetisi tersebut terdapat 428 developer peserta dari sekitar 40 kampus yang tersebar di seluruh Indonesia.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />Dari semuanya, terpilih 54 finalis dan 20 pemenang, dimana salah satunya adalah Eko Sakti.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />&quot;Salah satu pemilihan juri terhadap inovasi produk saya yaitu karena aplikasi yang saya ciptakan belum ada di pasaran. Penilaian yang lain juga ada pada fungsi atau kegunaan dari produk yang diciptakan,&quot; beber Eko. 
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <em>Nah</em>, setelah menang di ajang pembuatan aplikasi besutan Nokia tersebut, sang vendor asal Finlandia itu pun berencana untuk memasarkan aplikasi ciptaan Eko.
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660):  <br />
12-27 10:12:10.979: V/LogContentView(2660): </div>
12-27 10:12:40.059: V/LogContentView(2660): <div class="text_detail">
12-27 10:12:40.059: V/LogContentView(2660):  Malang - Indonesia memang memiliki developer aplikasi handal. Salah satunya dibuktikan Eko Sakti, dosen Universitas Brawijaya yang sukses menciptakan aplikasi di Windows Phone yang mampu membuat catatan tanpa harus menulis.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />Never Write -- demikian nama aplikasi tersebut -- bisa dibilang baru di Indonesia. Kemampuannya adalah mengubah 
12-27 10:12:40.059: V/LogContentView(2660):  <em>speech</em> (ucapan) bahasa Inggris menjadi bentuk teks. 
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />Eko mengaku, ide pembuatan aplikasi ini berawal saat mengikuti program Summer School di Bali yang bentuk pengajarannya menggunakan bahasa Inggris.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />&quot;Waktu itu saya ikut Summer School dan dosen yang mengajar menggunakan bahasa Inggris. Saya mencoba mencatat mungkin karena terlalu cepat berbicaranya, banyak yang tertinggal. Setelah di rumah saya coba buka kembali catatan saya, malah tambah bingung,&quot; cerita Eko kepada wartawan di Universitas Brawijaya, Jumat (21/12/2012).
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />Ditambahkannya, aplikasi Never Write bisa diupload di evernote. Selain itu aplikasi ini juga mempunyai kelebihan di antaranya bisa diakses di segala tempat dengan catatan file aplikasi sudah tersimpan pada perangkat genggam.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />Never Write tidak mempunyai batasan dalam memasukkan jumlah kata. Sehingga bisa digunakan sebagai sub title film yang nantinya bisa diubah dalam bahasa Indonesia.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />Sebagai bukti sahih kehebatannya, aplikasi ini pun sukses meraih gelar dalam kompetisi Nokia Lumia Apps Olympiad yang berlangsung dari pertengahan November 2012 lalu.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />Dalam kompetisi tersebut terdapat 428 developer peserta dari sekitar 40 kampus yang tersebar di seluruh Indonesia.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />Dari semuanya, terpilih 54 finalis dan 20 pemenang, dimana salah satunya adalah Eko Sakti.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />&quot;Salah satu pemilihan juri terhadap inovasi produk saya yaitu karena aplikasi yang saya ciptakan belum ada di pasaran. Penilaian yang lain juga ada pada fungsi atau kegunaan dari produk yang diciptakan,&quot; beber Eko. 
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <em>Nah</em>, setelah menang di ajang pembuatan aplikasi besutan Nokia tersebut, sang vendor asal Finlandia itu pun berencana untuk memasarkan aplikasi ciptaan Eko.
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660):  <br />
12-27 10:12:40.059: V/LogContentView(2660): </div>
12-27 10:14:25.989: V/LogContentView(3178): <div class="text_detail">
12-27 10:14:25.989: V/LogContentView(3178):  Malang - Indonesia memang memiliki developer aplikasi handal. Salah satunya dibuktikan Eko Sakti, dosen Universitas Brawijaya yang sukses menciptakan aplikasi di Windows Phone yang mampu membuat catatan tanpa harus menulis.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />Never Write -- demikian nama aplikasi tersebut -- bisa dibilang baru di Indonesia. Kemampuannya adalah mengubah 
12-27 10:14:25.989: V/LogContentView(3178):  <em>speech</em> (ucapan) bahasa Inggris menjadi bentuk teks. 
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />Eko mengaku, ide pembuatan aplikasi ini berawal saat mengikuti program Summer School di Bali yang bentuk pengajarannya menggunakan bahasa Inggris.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />&quot;Waktu itu saya ikut Summer School dan dosen yang mengajar menggunakan bahasa Inggris. Saya mencoba mencatat mungkin karena terlalu cepat berbicaranya, banyak yang tertinggal. Setelah di rumah saya coba buka kembali catatan saya, malah tambah bingung,&quot; cerita Eko kepada wartawan di Universitas Brawijaya, Jumat (21/12/2012).
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />Ditambahkannya, aplikasi Never Write bisa diupload di evernote. Selain itu aplikasi ini juga mempunyai kelebihan di antaranya bisa diakses di segala tempat dengan catatan file aplikasi sudah tersimpan pada perangkat genggam.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />Never Write tidak mempunyai batasan dalam memasukkan jumlah kata. Sehingga bisa digunakan sebagai sub title film yang nantinya bisa diubah dalam bahasa Indonesia.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />Sebagai bukti sahih kehebatannya, aplikasi ini pun sukses meraih gelar dalam kompetisi Nokia Lumia Apps Olympiad yang berlangsung dari pertengahan November 2012 lalu.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />Dalam kompetisi tersebut terdapat 428 developer peserta dari sekitar 40 kampus yang tersebar di seluruh Indonesia.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />Dari semuanya, terpilih 54 finalis dan 20 pemenang, dimana salah satunya adalah Eko Sakti.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />&quot;Salah satu pemilihan juri terhadap inovasi produk saya yaitu karena aplikasi yang saya ciptakan belum ada di pasaran. Penilaian yang lain juga ada pada fungsi atau kegunaan dari produk yang diciptakan,&quot; beber Eko. 
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <em>Nah</em>, setelah menang di ajang pembuatan aplikasi besutan Nokia tersebut, sang vendor asal Finlandia itu pun berencana untuk memasarkan aplikasi ciptaan Eko.
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178):  <br />
12-27 10:14:25.989: V/LogContentView(3178): </div>

person Dave Jackson    schedule 27.12.2012    source источник


Ответы (5)


Из вашего приведенного выше кода тело переменной должно быть возвращено из new LoadNews().execute("").get(), поэтому вы можете изменить функцию getItemBody, как показано ниже.

private void SetView(){ 
        // move uri here, and you can dinamyc uri.
        String uri = "http://inet.detik.com/read/2012/12/21/205518/2124977/398/dosen-unibraw-bikin-aplikasi-pengubah-suara-ketulisan";
        contentsWebView.loadData(HTML_HEADER + getItemBody(uri) + HTML_FOOTER,
        "text/html", "utf-8");
}

private String getItemBody(String uri) {
    String body = null;
    try {
        body = new LoadContent().execute(uri).get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return body;
}

и в классе asynctask, как показано ниже,

private class LoadContent extends AsyncTask<String, Integer, String> {
    private ProgressDialog Dialog = new ProgressDialog(
            ViewItemActivity.this);

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        Document doc;
        try {
            doc = Jsoup.connect(url).get();
            Elements element = doc.select(".text_detail");

            content = element.toString();
            Log.v("LogContentView", content);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return content;
    }

    protected void onPreExecute() {
        Dialog.setMessage("loading content...");
        Dialog.show();
    }

    protected void onPostExecute(String result) {
        Dialog.dismiss();
        super.onPostExecute(result);
    }

}

дайте мне знать, если есть журнал ошибок.

person Community    schedule 27.12.2012
comment
Я просто должен был измениться, пожалуйста, смотрите. Несколько дней назад я тоже сделал такой код. - person ; 27.12.2012
comment
Большое спасибо, Энди Унпам. Проблема решена с вашим кодом... Thanyouuuuu...... - person Dave Jackson; 27.12.2012

В вашем doInBackground вы возвращаете контент, и к этому контенту можно получить доступ в onPostExecute(). Попробуй это:

  private String getItemBody(String passedContent) {
            String body = "";
if(passedContent != null && !passedContent.equals(""))
{
body = passedContent;
}
            new LoadContent().execute("");
            return body;
        }


    protected String doInBackground(String... params) {
                String url = "http://inet.detik.com/read/2012/12/21/205518/2124977/398/dosen-unibraw-bikin-aplikasi-pengubah-suara-ketulisan";
                Document doc;
                try {
                    doc = Jsoup.connect(url).get();
                    Elements element = doc.select(".text_detail");

                    String content = element.toString();
                    Log.v("LogContentView", content);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                return content;
            }

    protected void onPostExecute(final String backgroundresult) {

    dialog.dismiss();

    String backgroundResult = backgroundresult;

    Stirng returnedString = getItemBody(backgroundResult); // But you are returning the same result over here and this makes the doInBackground() run again. 

    }
person Kanth    schedule 27.12.2012
comment
привет, спасибо за ответ, все еще ошибка в строке String returnString = getItemBody (String passContent); - person Dave Jackson; 27.12.2012
comment
Посмотрите редактирование и дайте мне знать, какую ошибку вы получаете. Без этого, вероятно, невозможно идентифицировать. - person Kanth; 27.12.2012

Попробуйте это, я надеюсь, что это может помочь вам решить вашу проблему

    private String itemContent;
    private static final String HTML_HEADER = "<html><body>";
    private static final String HTML_HEADER = "</body></html>";

В методе onCreate() вызовите метод getItemBody(item)

    private void SetView(){ 
            contentsWebView.loadData(HTML_HEADER + itemContent + HTML_FOOTER,
            "text/html", "utf-8");
    }      

    private void getItemBody(String item) {
        new LoadContent().execute(item);
    }

    private class LoadContent extends AsyncTask<String, Integer, String> {
        private ProgressDialog Dialog = new ProgressDialog(
                ViewItemActivity.this);

        @Override
        protected String doInBackground(String... params) {
            String url = "http://inet.detik.com/read/2012/12/21/205518/2124977/398/dosen-unibraw-bikin-aplikasi-pengubah-suara-ketulisan";
            Document doc;
            try {
                doc = Jsoup.connect(url).get();
                Elements element = doc.select(".text_detail");

                String content = element.toString();
                Log.v("LogContentView", content);
            } catch (IOException e) {
                e.printStackTrace();
            }

            return content;
        }

        protected void onPreExecute() {
            Dialog.setMessage("loading content...");
            Dialog.show();
        }

        protected void onPostExecute(String result) {
            Dialog.dismiss();
                    // You can get Item content from `doInBackgorund()` 
                    // to the  parameter result
                    itemContent = result;
                    SetView();
        }
    }
person RajeshVijayakumar    schedule 27.12.2012
comment
Привет, спасибо за ответ, но я все еще получаю сообщение об ошибке, сказал eclipse, необходимо повторить строку в методе getItemBody. - person Dave Jackson; 27.12.2012
comment
Если я просматриваю logcat в Log.v(LogContentView, content); получить результат в формате html, но в представлении содержимого веб-представления Android отображается значение null. - person Dave Jackson; 27.12.2012
comment
этот getItemBody(Item) ничего не возвращает. - person wtsang02; 27.12.2012

person    schedule
comment
Привет, спасибо за ответ, но я хочу получить строку из возвращаемого содержимого в doinbackground как тело строки в методе getItemBody. - person Dave Jackson; 27.12.2012

person    schedule
comment
Привет, спасибо за ответ, все еще ошибка в строке body = result; eclipse сказал, что тело строки должно быть окончательным, и у меня есть изменение на окончательное, но все еще ошибка в этой строке. но не показывать подсказки в eclipse - person Dave Jackson; 27.12.2012