【问题标题】:Get String from asynctask android从asynctask android获取字符串
【发布时间】:2012-12-12 12:23:21
【问题描述】:

如何从 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>

【问题讨论】:

    标签: android jsoup html-parser


    【解决方案1】:

    从上面的代码中,变量body必须从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);
        }
    
    }
    

    如果有错误日志,请告诉我。

    【讨论】:

    • 我只需要改变,请看。前几天我也做了这样的代码。
    • 非常感谢 Andy Unpam。您的代码解决了问题... Thanyouuuuu ......
    【解决方案2】:

    试试这个,希望它可以帮助您解决问题

        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();
            }
        }
    

    【讨论】:

    • 您好,谢谢回复,但我仍然收到错误,eclipse 说,必须在方法 getItemBody 中重新运行字符串。
    • 如果我在 Log.v("LogContentView", content);以 html 格式获取结果,但在 view android web view 内容中显示 null。
    • 这个 getItemBody(Item) 没有返回任何东西。
    【解决方案3】:
    @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;
                String content = null;
                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;
        }
    

    【讨论】:

    • 您好,感谢您的回复,但我想将字符串从 doinbackground 中的返回内容作为方法 getItemBody 中的字符串正文。
    【解决方案4】:
    private String getItemBody(Item item) {
            String body = "";
    
            new LoadContent(){
    
                  protected void onPostExecute(String result) {
                    super.onPostExecute(result);//Dialog.dismiss();
                    body = result;
                  }
            }.execute("");
    
        // this should wait until asynchron completes:
            return body;
        }
    

    【讨论】:

    • 您好,感谢您的回复,在正文 = 结果行中仍然有错误;eclipse 说字符串正文必须是最终的,我已经更改为最终的,但在这一行中仍然有错误。但在 Eclipse 中不显示提示
    【解决方案5】:

    在您的 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. 
    
        }
    

    【讨论】:

    • 您好,感谢您的回复,String returnedString = getItemBody(String passContent); 行中仍有错误;
    • 查看编辑并告诉我您遇到的错误。除非那样,否则可能无法识别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2015-06-11
    相关资源
    最近更新 更多