WebViewで表示中のページのHTML を参照するのに android.os.AsyncTask で
javascript の outerHTML を実行してソース表示のActivityを起動するのがスマートである。
javascript インターフェースを定義
BrowseRelay jsRelay;
webview.getSettings().setJavaScriptEnabled(true);
jsRelay = new BrowseRelay();
webview.addJavascriptInterface(jsRelay,"android");
BrowseRelayの中は、outerHTMLの結果をセットする中で、取得の完了を検知するためのフラグを true にする。
public class BrowseRelay{
private String htmltxt;
private boolean htmlget;
public String getHtmltxt(){
return htmltxt;
}
public void setHtmltxt(String htmltxt){
this.htmltxt = htmltxt;
htmlget = true;
}
public boolean isHtmlget(){
return htmlget;
}
public void startHtmlget(){
this.htmlget = false;
}
}
AsyncTaskを継承してインナークラスで javascript outerHTML を実行する。
class HtmlViewTask extends AsyncTask<String,Integer,String>{
private Context context;
protected HtmlViewTask(Context context){
this.context = context;
}
@Override
protected void onPreExecute(){
showDialog(2);
}
@Override
protected String doInBackground(String...params){
webview.loadUrl(params[0]);
while(!jsRelay.isHtmlget()){
try{Thread.sleep(100);}catch(InterruptedException e){}
}
return jsRelay.getHtmltxt();
}
@Override
protected void onPostExecute(String result){
dismissDialog(2);
Intent it = new Intent(this.context,HTMLViewActivity.class);
it.putExtra("source",result);
startActivity(it);
}
}
インナークラスから、HTML取得中のダイアログ表示の為に、Activity に以下を用意
@Override
protected Dialog onCreateDialog(int id){
Dialog dlg = new Dialog(this);
dlg.requestWindowFeature(Window.FEATURE_NO_TITLE);
if (id==0){
dlg.setContentView(R.layout.webdialog);
}else if(id==1){
dlg.setContentView(R.layout.webssldialog);
}else if(id==2){
dlg.setContentView(R.layout.loadingdialog);
}
dlg.getWindow().setBackgroundDrawable(new ColorDrawable(0));
return dlg;
}
MENUキーなどで実行する onOptionsItemSelected などで以下を実行する。
jsrelay.startHtmlget();
new HtmlViewTask(this).execute("javascript:android.setHtmltxt(document.documentElement.outerHTML);");