たぼさんの部屋

いちょぼとのんびり

T022) :6時間かけて、やっとできやした

f:id:donsuka_kk:20121125004704p:plain

Mondai.java

package com.example.t022_thread_join_jsinterface;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

@SuppressLint("SetJavaScriptEnabled")
public class Mondai implements Runnable {
	private Context context;
	private int ans = 0;
	private String mondaiStr;

	private WebView wv;
	private Thread thread;
	private Handler mainHandler = new Handler();

	/*
	 * test
	 */
	private int counter = 0; // private記述必要:Handlerからアクセスするため
	private String test_mondaiStr;

	// constractor
	public Mondai(Context context) {
		Log.v("Mondai Constractor", "Thread=" + Thread.currentThread().getId());

		this.context = context;
		mondaiStr = "1 + 4";
		test_mondaiStr = "4*4"; // test

		wv = new WebView(context);
		// Javascript 利用
		wv.getSettings().setJavaScriptEnabled(true);

		// JavascriptAdapter instance
		wv.addJavascriptInterface(this, "android"); // this このクラスで受ける

		thread = new Thread(this);
		thread.start();

	}

	@Override
	public void run() {
		String str;
		if (counter == 0) {
			str = mondaiStr;
		} else {
			str = test_mondaiStr;
		}
		makeKaitou(str);

	}

	private void makeMondai() {

	}

	protected void makeKaitou(final String mondai) {
		Log.v("Mondai makeKaitou", "Thread=" + Thread.currentThread().getId());
		Log.v("Mondai makeKaitou", "mondai=" + mondai);
		// Toast.makeText(context, "makeKaitou mondai=" + mondai,0).show();

//		wv.clearCache(true);
		
		wv.loadData("", "text/javascript", null); // 必要
		// XXX WebViewの読み込み完了時に処理を実行するように
		wv.setWebViewClient(new WebViewClient() {
			@Override
			public void onPageFinished(WebView view, String url) {
				// wv.loadUrl("javascript:callEval('" + mondai + "')"); //処理
				String script = "javascript:android.getAnswerFromJS(eval("
						+ mondai + "));";
				wv.loadUrl(script);
			}
		});

	}

	public int getAns() {

		return ans;
	}

	// Javascriptから呼び出されるメソッド
	public void getAnswerFromJS(final String answer) {
		Log.v("getAnswerFromJS", "Thread=" + Thread.currentThread().getId());
		Log.v("getAnswerFromJS","counter= "+counter+",answer="+answer);
		ans = Integer.parseInt(answer);
		if (counter == 0) {

			thread = new Thread(this);
			thread.start();
		}
		counter++;
		
		mainHandler.post(new Runnable() {
			public void run() {
				// 計算結果をログ出力
				Log.d("TAG", answer);
				// Main.kotae.setText(answer);
				Toast.makeText(context, "getAnswerFromJS" + answer,
						Toast.LENGTH_SHORT).show();
				toast();
				Main.setMondai(answer);

			}
		});

	}

	private void toast() {
		Toast.makeText(context, "counter" + counter, Toast.LENGTH_SHORT).show();
	}

}