http://www.okjsp.net/seq/269952
안녕하세요.
브릿지를 통해 안드로이드와 자바스크립트 간의 호출을 하려고 합니다.
지금 jsp에서 버튼을 누르면 자바스크립트 함수가 실행되고
함수에서 "gps 위치정보 호출""라는 말을 쓰면 앱의 로그에 찍힙니다.
window.HybridApp.MoveMessage("gps 위치정보 호출");
이제 안드로이드의 함수의 MoveMessage가 실행되고 위치정보값을 js로 보내줘야 하는데요..
mWeb.loadUrl("javascript:setMessage('" +abc1+ "')");
여기에서 abc1의 값이 null로 나옵니다.
abc1은
super.onCreate(savedInstanceState);{
..private String abc1;..
mWeb.loadUrl("javascript:setMessage('" +abc1+ "')");
...}
함수a(){
abc1 = 가나다"";
}
이런식으로 되어 있습니디. 설명이 부족하시면 계속 추가 겠습니다.
음.. abc1의 값이 지금은 null인데 어떻게 해야 하나요? js로 보내려면
--------------------------------------------------------------------------------
글 추가 하겠습니다.
설명을 너무 길게 한 것 같아 줄이다 보니 이해 못하실 글을 쓰게 되었습니다.
우선 상황설명을 드리자면 저는 하이브리드앱을 수정 중에 있습니다.
위치정보를 받아야 하는 상황인데 , 요즘엔 그냥 받아선 안 되고 사용자의 동의가 있어야 한다더라고요 .
그래서 gps on / off 창?이 뜨게 하고 on일 때 위치 정보를 가져오도록 했습니다.(앱 쪽 에서요.)
이 위치정보를 다시 웹으로 가져오기 위해서는 Bridge를
사용하면 된다길래 따라해봤습니다.
Bridge에 대한 android쪽 소스입니다.
public class LeafManager extends Activity implements LocationListener{
....
private String abc1;
...
protected void onCreate(Bundle savedInstanceState) {
setting.setJavaScriptEnabled(true);//자바스크립트를 실행할 수 있도록 설정
mWeb.addJavascriptInterface(new AndroidBridge(), "HybridApp");
mWeb.loadUrl("javascript:setMessage()"); // 웹뷰에서 url 불러오기
}
//Javascript에서 호출될 함수 구현
//AndroidBridge = webview에 등록할 인터페이스
private class AndroidBridge {
public void MoveMessage(final String arg) { // must be final
mHandler.post(new Runnable()
public void run() {
mWeb.loadUrl("javascript:setMessage('" +abc1+ "')");
//"js로 보낼 값"
Log.i(TAG, "arg:" + arg);
Log.i(TAG, "abc1:" + abc1);
}
});
}//MoveMessage
}//AndroidBridge
private void setConfigGPS() {
....
this.abc1 = provider;
}
-----------------------------------------
web의 js입니다.
function setMessage(){
var a = "11111";
var b = "22222";
var c = "33333";
alert(a);
window.HybridApp.MoveMessage("gps 위치정보 호출");
alert(b);
document.getElementById("replaceme").innerHTML = abc ;
alert(c);
}
...
<div><input type="button" id="test" value="안드브릿" onclick="setMessage()"></div><br>
<br>
<div><p id="replaceme"></p> </div><br>
<br>
-----------------------------
지금 '안드브릿' 이라는 버튼을 누를 때 마다 alert(a)와 alert(b)가 번갈아 뜹니다.
logcat을 보면
arg:gps 위치정보 호출
abc1:null
이렇게 뜨고 있습니다.
답변1 .
abc1 이란게, 자바스크립트 단인가요?
아님 안드로이드인가요?
뭔소린지 핵심적인 부분은
하나도 모르게 적어놓으셨네요.
말로 설명 잘 못하는 개발자가 많긴하지만,
글로도 설명 못할정도로 정리가 안된다는 건,
자신도 뭐가 뭔지 모르고 짠다는 소리임.
그냥 제멋대로 예측했을때, javascript 단 변수고,
웹상에서 위치센서를 통해 값을 얻는 방식이라면,
스크립트의 실행속도는 빠른데, 센서의 값추출 속도가
느려서 null 값 발생이라 생각됩니다만...
답변2.
cordova(or phonegap)을 사용해보는게 어떠신가요?
브릿지를 처음부터 만들다보면 여러가지 문제가 발생하는데, 이미 잘 만들어 놓은 것을 쓰면 사소한 문제는 신경쓰지 않아도 되거든요.
여의치 않으면 cordova 소스를 보세요. 그 안에 원하시는 대답이 있습니다.
지금 문제는 cordova.js 의 exec 함수랑 org.apache.cordova.CallbackContext만 보시면 될 것 같네요.
내 답글
두 분 답변 감사드립니다.
->
우선은 logcat에 abc1의 값이 뜨도록 해야 할 것 같습니다.
전역변수로 하면 될까 싶어서 해보려고 합니다.
답변1.1
AndroidBridge 써본적 없고, 그냥 cordova 씁니다만...
추측해볼때 저건 그냥 setConfigGPS() 시점이 느려서, abc1 값이 할당 되기전에
Thread 돌아서 그런거 아닌가요?
그리고, cordova 도 문제 많습니다.
특히, JellyBean 버전에서 안생기던 문제가 Kitkat 에서 발생되죠.
Memory Management 와 각 Plugin 들의 내부 Thread 동작 문제 해결이 젤 컸던것 같습니다.
내 답글
setConfigGPS() 시점이 느려서, abc1 값이 할당 되기전에
Thread 돌아서 그런거 아닌가요?
-> 이게 맞는 것 같아요 abc에 그냥 다른 값을 넣으면( ex. abc="가나다" )
log에 abc : 가나다 이렇게 나와요 . js로 넘어가진 않고요.
그럼 이 시간 차는 어떻게 해결 해야 하나요?
답변1.2
시간차는 null 값이 아니면, 걍~ 스크립트 실행하게 하면 되는거 아닌가요?
Bridge 가 뭔지는 잘모르겠으나, 제가 보기엔 쉬운문제인거 같은데...
일단 Thread 로 구현된거보니, 주기적으로 실행된다는 느낌이고...
그렇담, 값이 발생되면, 스크립트 실행해주면 땡이잖아요.
별거 아닌듯 보이는데...
if(abc != null) {
mWeb.loadUrl("javascript:setMessage('" +abc1+ "')");
}
내 답글
값 넘겼습니다 ; js함수에 빠진게 있어서 안드로이드에서 js넘어갈 때 함수를 못 찾고 있었던 것 같습니다.
지금은 함수가 계속 반복되서 그걸 해결해 보려고 합니다.
답변 감사드립니다.
'나의질문답' 카테고리의 다른 글
사진크기 어떻게 구하나요? 계산방법 (0) | 2015.01.22 |
---|---|
Ajax error나는 이유 질문드립니다. (0) | 2015.01.20 |
mysql dump만들기 질문드립니다. (0) | 2014.12.29 |
ibatis질문드립니다. (0) | 2014.12.19 |
mysql update질문있습니다. (0) | 2014.12.10 |