java.util.concurrent.Executors
盛り込んでみました。動作確認は帰途にて。
Activity の実装が以下。
package jp.shuri.yamanetoshi.GMapSample1; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import android.app.Activity; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.webkit.WebView; public class GMapSample extends Activity implements LocationListener, Runnable { class JsObj { private Location loc; public void getLastKnownLocation(Location location) { loc = location; Log.i("JsObj", "Latitude is " + getLat()); Log.i("JsObj", "Longitude is " + getLng()); } public double getLat() { return loc.getLatitude(); //return 26.19; } public double getLng() { return loc.getLongitude(); //return 127.67; } } private WebView webView; private JsObj jo; private LocationManager lm; private final int TIMER_PERIOD = 500; private Boolean mRunning = false; private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); webView = new WebView(this); webView.getSettings().setJavaScriptEnabled(true); jo = new JsObj(); lm = (LocationManager)getSystemService(LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this); Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); jo.getLastKnownLocation(location); webView.addJavascriptInterface(jo, "roid"); webView.loadUrl("file:///android_asset/index.html"); setContentView(webView); mRunning = true; scheduler.scheduleAtFixedRate(this, TIMER_PERIOD, TIMER_PERIOD, TimeUnit.MILLISECONDS); } @Override protected void onDestroy() { mRunning = false; scheduler.shutdown(); super.onDestroy(); } public void onLocationChanged(Location location) { // TODO Auto-generated method stub } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } public void run() { if(!mRunning) return; Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); jo.getLastKnownLocation(location); webView.loadUrl("javascript:reloadFunction()"); } }
あと、assets/index.html が以下。
<html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> var map; var marker; function setMarker(location) { marker = new google.maps.Marker({ position: location, map: map }); marker.setMap(map); } function initialize() { var latlng = new google.maps.LatLng(roid.getLat(), roid.getLng()); var myOptions = { zoom: 16, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); setMarker(latlng); } function reloadFunction() { marker.setMap(null); var latlng = new google.maps.LatLng(roid.getLat(), roid.getLng()); map.setCenter(latlng); setMarker(latlng); } </script> </head> <body onload="initialize()"> <div id="map_canvas" style="width:100%; height:100%"></div> </body> </html>
別途 GitHub 方面に放り込む方向ス。
これって
onPause() あたりで scheduler.cancel() 発行した方が良さげです。