Help us understand the problem. What is going on with this article?

Using WebView with Andorid app

More than 3 years have passed since last update.

Android appでは、Webとの通信をJsoupなどを用いてする際には、別スレッドを立てなければいけないという制約がある。

今回は、Jsoupを用いてあるwebページのHTMLコードのbodyタグ内をtextViewコンポーネントに表示させてみる。これがまず、MainActivity。諸事情により、Processingのsize()というメソッドのリファレンスのHTMLコードを取りに行っている。


package ...

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import android.widget.Toast;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;


public class MainActivity extends AppCompatActivity {

    public Document document;
    public TextView textView;
    public String url;

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

        url = "https://processing.org/reference/size_.html";

        textView = (TextView) findViewById(R.id.textView);

        DownloadTask task = new DownloadTask();
        task.execute("start");
    }


    public class DownloadTask extends AsyncTask<String, Integer, Elements> {

        @Override
        protected Elements doInBackground(String... params) {
            Elements title = null;
            try {
                document = Jsoup.connect(url).get();
                title = document.getElementsByTag("title");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return title;
        }

        @Override
        protected void onPostExecute(Elements result) {
            if (result == null) {

            }
            else {
                textView.setText(result.toString());
            }
        }


    }
}



この操作を実行するには、細かくわけると2つの工程がある。

(i)別スレッドを立てる

(ii)url先のHTMLコードを取りに行く

(i)別スレッドを立てる

これは、Android4.0以上?からの決まりで上のコードだとAsyncTaskクラスを継承したDownloadTaskが担っている。この中には、doInBackground()というメソッドが定義されていてこれをオーバーライドしてメソッド名通り別スレッド内での処理を記述する。上の例では、Jsoupを使って(Jsoupについては(ii)で記述する。)htmlを取りに行っている。また、onPostExecute()は、doInBackground()の処理が終わったあとの処理を記述するメソッドで、ここではTextViewに表示する処理を書いている。

(ii)url先のHTMLコードを取りに行く

AsyncTaskを使って別スレッドを立てたら、あとはそのスレッド内でHTMLコードを取るために目的のurlにアクセスすればいい。これを簡単にしてくれるのがJsoupというライブラリである。取得されたHTMLはタグなどによって検索が可能でgetElementsByTag()で検索を行ってtitleタグ内のコードをtitleという変数で保持している。


AsyncTaskとJsoupを組み合わせた解説が少なかったので議事録として残してみた。

omuomugin
Software Engineer Living in Tokyo https://twitter.com/omuomugin
https://scrapbox.io/omuomugin/
recruitmp
結婚・カーライフ・進学の情報サイトや『スタディサプリ』などの学びを支援するサービスなど、ライフイベント領域に関わるサービスを提供するリクルートグループの中核企業
http://www.recruit-mp.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした