Contents

API 적용

Webview 적용

하이브리드 앱에서 앱 버튼에 적용하는 방법을 알아봅니다.

Javascript 설정

웹 페이지에 netfunnel.js 파일을 include 한 후에 페이지 상단에 아래의 함수를 정의하세요.


	

Java 설정

//라이브러리 선언
//패키지명으로 변경
import com.aimtog.www.example.R;
import com.netfunnel.api.ContinueData;
import com.netfunnel.api.LoadProperty;
import com.netfunnel.api.Netfunnel;
import com.netfunnel.api.Property;

public class MyActivity extends ActionBarActivity {
	private WebView mWebView;
	private final Handler mHandler = new Handler();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_my);
		
		mWebView = (WebView)findViewById(R.id.webview);
		final Context myApp = this;
		mWebView.setWebChromeClient(new WebChromeClient() {
			@Override
			public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result) {
			new AlertDialog.Builder(myApp)
				.setTitle("AlertDialog")	
				.setMessage(message)
				.setPositiveButton(android.R.string.ok,
					new AlertDialog.OnClickListener(){
						public void onClick(DialogInterface dialog, int which){
							result.confirm();
						}
					})
				.setCancelable(false)
				.create()
				.show();
			return true;
		};
	});
	// 넷퍼넬 서버 설정 파일을 받아오도록 하고 싶을때, 없으면 기본 설정
	mWebView.getSettings().setJavaScriptEnabled(true);
	mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
	mWebView.addJavascriptInterface(new NetFunnelJavaScriptInterface(),"androidNetFUNNEL");
	// property json 데이터 받아올 url
	mWebView.loadUrl("http://nf2.netfunnel.co.kr/netfunnel.html");
	}
	
	@Override
	public void onConfigurationChanged(Configuration config) {
		super.onConfigurationChanged(config);
	}
	
	public final class NetFunnelJavaScriptInterface{
		public NetFunnelJavaScriptInterface(){
		}
		@JavascriptInterface
		public boolean success() {
			mHandler.post(new Runnable() {
				@Override
				public void run() {
					mWebView.loadUrl("javascript:test_end()");
					Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_SHORT).show();
				}
			});
			return(true);
		}
		@JavascriptInterface
		public boolean continued() {
			//Toast.makeText(getApplicationContext(), "continued", Toast.LENGTH_SHORT).show();
		return(true);
	}
	@JavascriptInterface
	public boolean stop() {
		Toast.makeText(getApplicationContext(), "stop", Toast.LENGTH_SHORT).show();
		return(true);
	}
	@JavascriptInterface
	public boolean error() {
		Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();
		return(true);
	}
	@JavascriptInterface
	public boolean bypass() {
		Toast.makeText(getApplicationContext(), "bypass", Toast.LENGTH_SHORT).show();
		return(true);
	}
	@JavascriptInterface
	public boolean block() {
		Toast.makeText(getApplicationContext(), "block", Toast.LENGTH_SHORT).show();
		return(true);
	}
	@JavascriptInterface
	public boolean ipblock() {
		Toast.makeText(getApplicationContext(), "ipblock", Toast.LENGTH_SHORT).show();
		return(true);
	}
	@JavascriptInterface
	public boolean expressnumber() {
		Toast.makeText(getApplicationContext(), "expressnumber", Toast.LENGTH_SHORT).show();
		return(true);
		}
    }									


}															

적용

버튼마다 액션 아이디를 다르게 줄 경우 인자 값으로 액션 아이디를 넘겨서 처리하세요.

// 앱에서 버튼을 눌렀을때 javascript 호출 함수
public void btnWebView_Click(View view) {
mWebView.loadUrl("javascript:test_android('service_1', 'act_1')");
}		

handler 적용

전용 애플리케이션에서 handler 방식 적용 방법을 알려줍니다.

설정

@Override	
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_my);
	
Property property =Property.getDefaultInstance();
// 넷퍼넬 서버 기본 설정을 변경한다.
property.setProtocol("http");
property.setHost("58.181.39.190");
property.setPort(80);

// 넷퍼넬 서버 기본 설정을 다운받아서 사용할 수 있다.
LoadProperty load_property = LoadProperty.getGlobalInstance();
load_property.setUrl("http://nf2.netfunnel.co.kr/property.html");
load_property.setErrBypass(true);
load_property.setUpdateInterval(30);
}	

적용

public void btnLibApiHandler_Click(View view) {
	// 서비스 ID, 액션 ID를 지정한다
	Netfunnel.BEGIN("service_1","5"
	,NetfunnelDialog.Show(this)
	,new Handler(){	
	public void handleMessage(Message msg){
		try {
			Bundle data = msg.getData();
			Netfunnel.EvnetCode code = Netfunnel.EvnetCode.toEnum(msg.what);
			Netfunnel netfunnel = (Netfunnel)msg.obj;
			if(code.isContinue()){
				ContinueData continue_data = netfunnel.getContinueData();
				if (code == Netfunnel.EvnetCode.ContinueInterval) {
				} else { // Netfunnel.EvnetCode.Continue
					String continue_msg = " 예상대기시간:" + continue_data.getCurrentWaitTimeSecond() + "초\n"
					+" 진 행 율:" + continue_data.getCurrentWaitPercent() + "%\n"
					+" 대기자수(앞):" + continue_data.getCurrentWaitCount() + "명\n"
					+" 대기자수(뒤):" + continue_data.getCurrentNextCount() + "명\n"
					+" 초당처리량(TPS):" + netfunnel.getResponse().getTPS() + "\n"
					+" 확인주기(TTL):" + netfunnel.getResponse().getTTL() + "초\n"
					+" notice acount:" + continue_data.getAcountNOtice() + "\n"
					+" update acount:" + continue_data.getUpdateNOtice() + "\n"
					+" UI 표시대기시간:"  + netfunnel.getProperty().getUiWaitTimeLimit() + "초\n"
					+ "UI 표시대기자수(앞):" + netfunnel.getProperty().getUiWaitCountLimit() + "명\n"
					+ "UI 표시대기자수(뒤):" + netfunnel.getProperty().getUiNextCountLimit() + "명";
				Log.d("netfunnel", "-------------------------\n" + continue_msg);
			}
			return;
		}
		NetfunnelDialog.Close();
		if(code.isSuccess()){
			Toast.makeText(getApplicationContext(), "onSuccess:"+code, Toast.LENGTH_LONG).show();
			// TODO: 자체처리영역
			if(code == Netfunnel.EvnetCode.Success) {
			// 주의) 여기에만 AliveNotice()을 사용할수 있는 곳
			}else if(code == Netfunnel.EvnetCode.NotUsed){
			}else if(code == Netfunnel.EvnetCode.Bypass){
			}else if(code == Netfunnel.EvnetCode.ErrorBypass){
			}else if(code == Netfunnel.EvnetCode.ExpressNumber){
			}
		}else if(code.isBlocking()){
			Toast.makeText(getApplicationContext(), "onBlocking:"+code, Toast.LENGTH_LONG).show();
			// TODO: 자체처리영역
			if(code == Netfunnel.EvnetCode.Block) {
				// 서비스 차단
			}else if(code == Netfunnel.EvnetCode.IpBlock){
				// 사용자 사용패턴에 의한 차단
			}
			// 정지 버튼 눌렀을때 이벤트 처리
			}else if(code.isStop()){
				Toast.makeText(getApplicationContext(), "onUserStop:"+code, Toast.LENGTH_LONG).show();
				// TODO: 자체처리영역
			}else{ // }else if(code.isError()){
				Toast.makeText(getApplicationContext(), "onError:"+code, Toast.LENGTH_LONG).show();
				// TODO: 자체처리영역
			}
			Netfunnel.END();
		}catch (Exception e){
			e.printStackTrace();
		}
	}
});
				}																	

Listener 적용

전용 애플리케이션에서 listener 방식 적용 방법을 알려줍니다.

설정

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_my);
	
	Property property =Property.getDefaultInstance();
	// 넷퍼넬 서버 기본 설정을 변경한다.
	property.setProtocol("http");
	property.setHost("58.181.39.190");
	property.setPort(80);
	
	// 넷퍼넬 서버 기본 설정을 다운받아서 사용할 수 있다.
	LoadProperty load_property = LoadProperty.getGlobalInstance();
	load_property.setUrl("http://nf2.netfunnel.co.kr/property.html");
	load_property.setErrBypass(true);
	load_property.setUpdateInterval(30);
}		

적용

public void btnLibApiListener_Click(View view) {
	// 서비스 ID, 액션 ID를 지정한다.
	Netfunnel.BEGIN("service_1","5"
		,NetfunnelDialog.Show(this)
		,new Netfunnel.Listener(){
		@Override	
		public void netfunnelMessage(Netfunnel netfunnel, Netfunnel.EvnetCode code) {
			try {
				Log.d("netfunnel", "netfunnelMessage -> code: " + code + " / "+netfunnel.getResponse().getCode() + " ttl=" + netfunnel.getResponse().getTTL());
				if (code.isContinue()) {
					ContinueData continue_data = netfunnel.getContinueData();
					if (code == Netfunnel.EvnetCode.ContinueInterval) {
					} else { // Netfunnel.EvnetCode.Continue
						String continue_msg = " 예상대기시간:" + continue_data.getCurrentWaitTimeSecond() + "초\n"
					+" 진 행 율:" + continue_data.getCurrentWaitPercent() + "%\n"
					+" 대기자수(앞):" + continue_data.getCurrentWaitCount() + "명\n"
					+" 대기자수(뒤):" + continue_data.getCurrentNextCount() + "명\n"
					+" 초당처리량(TPS):" + netfunnel.getResponse().getTPS() + "\n"
					+" 확인주기(TTL):" + netfunnel.getResponse().getTTL() + "초\n"
					+" notice acount:" + continue_data.getAcountNOtice() + "\n"
					+" update acount:" + continue_data.getUpdateNOtice() + "\n"
					+" UI 표시대기시간:"  + netfunnel.getProperty().getUiWaitTimeLimit() + "초\n"
					+ "UI 표시대기자수(앞):" + netfunnel.getProperty().getUiWaitCountLimit() + "명\n"
					+ "UI 표시대기자수(뒤):" + netfunnel.getProperty().getUiNextCountLimit() + "명";
				Log.d("netfunnel", "-------------------------\n" + continue_msg);
			}
			return;
		}
		NetfunnelDialog.Close();
		if (code.isSuccess()) {
			// TODO: 자체처리영역
			if(code == Netfunnel.EvnetCode.Success) {
				// 주의) 여기에만 AliveNotice()을 사용할수 있는 곳
			}else if(code == Netfunnel.EvnetCode.NotUsed){
			}else if(code == Netfunnel.EvnetCode.Bypass){
			}else if(code == Netfunnel.EvnetCode.ErrorBypass){
			}else if(code == Netfunnel.EvnetCode.ExpressNumber){
			}
		} else if (code.isBlocking()) {
			// TODO: 자체처리영역
			if(code == Netfunnel.EvnetCode.Block) {
				// 서비스 차단
			}else if(code == Netfunnel.EvnetCode.IpBlock){
				// 사용자 사용패턴에 의한 차단
			}
		} else if (code.isStop()) {
			// TODO: 자체처리영역
		} else { // }else if(code.isError()){
			// TODO: 자체처리영역
		}
		Netfunnel.END();
	} catch (Exception e) {
		e.printStackTrace();
		}
	}
});
}