나의질문답

브릿지로 안드 자바스크립트 통신질문 드립니다.

예쁜꽃이피었으면 2015. 1. 13. 16:18

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넘어갈 때 함수를 못 찾고 있었던 것 같습니다. 

지금은 함수가 계속 반복되서 그걸 해결해 보려고 합니다. 

답변 감사드립니다.



반응형