언어&플랫폼/Android 2015. 10. 15. 15:50

oncreate에서 

mWvWebView.loadUrl("javascript:myfunctoin(\"2al\")"); 로 바로 실행하였더니 javascript 함수가 실행하지 않고 다음과 같은 로그가 뜬다.


Uncaught ReferenceError: testAlert is not defined



WebViewClient를 구현한 클래스에서 onPageFinished 함수를 오버라이딩 하여

그 부분에서 자바스크립트 함수를 실행하면 된다.


페이지가 전부 로드되기도 전에 함수를 실행하려 해서 안되었나보다.




posted by cozyboy
:
학습자료/Java 2015. 7. 22. 10:11

자바에는 기본적으로 ScheduledJob과 Timer 이용하여 간단한 스케줄링이 가능하다.

하지만 30분 마다 0에 , 월요일부터 금요일까지 와 같이 디테일하게 스케줄링은 하기 어렵다.

리눅스에 crontab 이라는 스케줄링 데몬이 있는데 자바에서 그와 같은 동작을 하는 라이브러리를 사용하겠다.


crontab 사용

예)

20  2     *  *  6  명령어 => 매주 토요일 새벽 2:20

0  4-6   *  *  *  명령어 => 매일 오후 4,5,6시

5  */2 *  *  * 명령어 => 매일 2시간간격으로 5분대에

15  1   1  *  *  명령어 => 매월 1일 새벽 1:15

30  0   1  1,7  *  명령어 => 1,7월 1일 새벽 0:30


quartz 라이브러리 다운로드(2.2.1)

http://quartz-scheduler.org/downloads



quartz 크론 표기법

http://quartz-scheduler.org/api/2.2.0/org/quartz/CronExpression.html

Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - * /
Minutes 0-59 , - * /
Hours 0-23 , - * /
Day-of-month 1-31 , - * ? / L W
Month 1-12 or JAN-DEC , - * /
Day-of-Week 1-7 or SUN-SAT , - * ? / L #
Year (Optional) empty, 1970-2199 , - * /


1.  main class (스케줄러에 job 등록, job에 데이터 바인딩, 스케줄러 주기 세팅)

public class CronTest {

public CronTest() {

try {

ArrayList state = new ArrayList<String>();

//주기적으로 실행시클 job 클래스 등록

//job 클래스는 생성자에 인자가 들어가면 안됨, inner class로 생성하면 안됨.

//job 클래스에 데이터 전송

JobDetail job = JobBuilder.newJob(DumbJob.class)

.withIdentity("testJob")

.usingJobData("jobSays", "Hello World!")

.usingJobData("myFloatValue", 3.141f).build();

job.getJobDataMap().put("state", state);


// 10초마다 계속 돌기 java Timer와 비슷

/*

* Trigger trigger = TriggerBuilder.newTrigger()

* .withSchedule(SimpleScheduleBuilder.simpleSchedule()

* .withIntervalInSeconds(10) .repeatForever()) .build();

*/


// CronTrigger 매 10초마다(10,20,30 ...) 작업 실행

CronTrigger cronTrigger = TriggerBuilder

.newTrigger()

.withIdentity("crontrigger", "crontriggergroup1")

.withSchedule(

CronScheduleBuilder.cronSchedule("*/10 * * * * ?"))

.build();


// schedule the job

SchedulerFactory schFactory = new StdSchedulerFactory();

Scheduler sch = schFactory.getScheduler();

    //스케줄러 시작

sch.start();

sch.scheduleJob(job, cronTrigger);

// 스케줄러 정지 sch.shutdown();


} catch (SchedulerException e) {

e.printStackTrace();

}

}


public static void main(String[] args) {

new CronTest();

}

}



2. job 구현

public class DumbJob implements Job {

    String jobSays;

    float myFloatValue;

    ArrayList state;

      

    public DumbJob() {

    }


//스케줄러에 인해 주기적으로 실행되는 함수.

    public void execute(JobExecutionContext context)

      throws JobExecutionException

    {

      JobKey key = context.getJobDetail().getKey();

      JobDataMap dataMap = context.getMergedJobDataMap(); 


//데이터는 아래 setter에서 저장된다. 혹은 아래와 같이 얻어도 된다.

/*

       String jobSays = dataMap.getString("jobSays");

       float myFloatValue = dataMap.getFloat("myFloatValue");

       ArrayList state = (ArrayList) dataMap.get("myStateData"); 

*/

      state.add(new Date());

      System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue + ", state size:" + state.size() + "," +state.get(state.size()-1));

    }


//아래와 같이 setter 형식으로 값을 받을 수도 있고 혹은, datamap을 통해 얻을 수 있음

    public void setJobSays(String jobSays) {

      this.jobSays = jobSays;

    }

    public void setMyFloatValue(float myFloatValue) {

      this.myFloatValue = myFloatValue;

    }

    public void setState(ArrayList state) {

      this.state = state;

    }}


3. 실행결과

Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:1,Wed Jul 22 10:03:40 KST 2015

Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:2,Wed Jul 22 10:03:50 KST 2015

Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:3,Wed Jul 22 10:04:00 KST 2015


.....





참고

quartz 사이트(tutorials, examples, cookbook)

http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start


'학습자료 > Java' 카테고리의 다른 글

[java] 자바어플에 webview(javafx) 삽입  (0) 2015.03.16
[java] jTable 실시간 값 변경  (0) 2015.01.08
[java] timetask  (0) 2015.01.08
[java] 파일 실행  (0) 2015.01.08
[java] html 파싱, jsoup 예제  (0) 2015.01.08
posted by cozyboy
:
언어&플랫폼/Android 2015. 6. 29. 20:07

인증모듈때문에 NICE ID 페이지와 연동하는 부분이 있었는데 키캣은 잘 동작하였으나 롤리팝에서 was loaded over HTTPS, but is submitting data to an insecure location at 와 같은 로그가 찍혔다.


TLS/SSL Default Configuration Changes

These changes may lead to breakages in HTTPS or TLS/SSL connectivity in a small number of cases listed below.
이러한 변화는 아래 의 경우 소수 HTTPS 또는 TLS / SSL 연결 의 파손 으로 이어질 수 있습니다.


5.0의 변화부분에 위와 같은 글이 있었고, 아래글과 같은 과정으로 해결을 하였다.





안드로이드 롤리팝 Webview 에서 발생한 문제들..
몇일전부터 안드로이드 5.0 버전으로 테스트중인 Nexus 5 에서 결제작업을 연동중에

문제점들이 발견되기 시작했다.

첫번째 : 의외로 간단하게 해결된 문제

HTTPS > HTTP 전송시 내장 브라우저에서 block 시켜 데이터 전송이 안되는 문제였다. 


[blocked] The page at 'https://xxx' was loaded over HTTPS, but ran insecure content from http://xxx.css': this content should also be loaded over HTTPS.


라는 메세지를 콘솔창으로 마구 뱉는 문제였다...

이 문제는 롤리팝에서 변경된 문제였다.

구글링 해보았으나 실제로 안드로이드 관련정보는 찾을수 없었고

해결방안은 Anroid 5.0 Changes 를 보고 찾을 수 있었다.

WebView



If your app targets API level 21 or higher:
  • The system blocks mixed content and third party cookies by default. To allow mixed content and third party cookies, use the setMixedContentMode() and setAcceptThirdPartyCookies() methods respectively.
  • The system now intelligently chooses portions of the HTML document to draw. This new default behavior helps to reduce memory footprint and increase performance. If you want to render the whole document at once, disable this optimization by calling enableSlowWholeDocumentDraw().
  • If your app targets API levels lower than 21: The system allows mixed content and third party cookies, and always renders the whole document at once.


혼합된 컨텐츠와 서드파티 쿠키가 설정에 따라 Webview 에서 Block 시키는 게 기본이 됬다는 내용이였다.


public abstract void setMixedContentMode (int mode)


Configures the WebView's behavior when a secure origin attempts to load a resource from an insecure origin. By default, apps that target KITKAT or below default to MIXED_CONTENT_ALWAYS_ALLOW. Apps targeting LOLLIPOP default toMIXED_CONTENT_NEVER_ALLOW. The preferred and most secure mode of operation for the WebView is MIXED_CONTENT_NEVER_ALLOW and use of MIXED_CONTENT_ALWAYS_ALLOW is strongly discouraged.


MIXED_CONTENT_ALWAYS_ALLOW : 항상 허용



MIXED_CONTENT_COMPATIBILITY_MODE : 호환성 모드



MIXED_CONTENT_NEVER_ALLOW : 허용 안함


해결 소스

if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
set.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setAcceptThirdPartyCookies(mWeb, true);
}




http://developer.android.com/about/versions/android-5.0-changes.html#ssl

롤리팝(5.0) change log 를 살펴보시면

TLSv1.1과 TLSv1.2, AES-GCM(AEAD)가 지원되고

MD5, 3DES, ECDH등은 더이상 지원하지 않는다고 합니다.

TLS/SSL 기본 설정값이 달라졌기 때문에, 서버가 MD5나 3DES만 지원한다면, 이것을 먼저 고쳐야 한다는 내용인 듯 싶어요




참고, 펌

http://www.masterqna.com/android/40747/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%A1%A4%EB%A6%AC%ED%8C%9D%EC%97%90%EC%84%9C-ssl-https-%ED%86%B5%EC%8B%A0%EC%9D%B4-%EC%95%88%EB%90%A9%EB%8B%88%EB%8B%A4

http://kalesst.blogspot.kr/2015/01/android-50-lollipop-webview-issue.html


posted by cozyboy
: