web.html


<script>
        function callbackFunctionName() {
            $('input[name=keyword]').focus();
        }
       
        $(function() {
            location.href = 'iwtapplink-command://initFocusWithSoftKeyboard?callback=callbackFunctionName';

        });
    </script>



android app

    public boolean shouldOverrideUrlLoading(WebView paramWebView, String paramString) {
        if (paramString.startsWith(activity.getString(R.string.appLinkIwtCommandInitFocusWithSoftKeyboard))) {
                InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

                String callback = "callbackFunctionName";
                if(paramString.indexOf("?") > 0) {
                    try {
                        Map<String, String> queryStringMap = StringUtil.queryStringToMap(paramString.replace(activity.getString(R.string.appLinkIwtCommandInitFocusWithSoftKeyboard) + "?", ""));

                        if (!TextUtils.isEmpty(queryStringMap.get("callback"))) {
                            callback = queryStringMap.get("callback");
                        }
                    } catch (UnsupportedEncodingException uee) {

                    }
                }

                webView.loadUrl("javascript:" + callback + "();");

                return true;
            }

            return false;
        }

Posted by incree

2018/06/06 03:50 2018/06/06 03:50
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/395

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

[PHP] 환경변수를 이용한 서버 구분

php에서 환경변수를 이용한 서버 구분(상용, 개발, 스테이지등...)


1. 웹으로 접속하는 경우
아파치를 웹서버로 사용하는 경우
SetEnv를 이용

httpd.conf 또는 /httpd-vhosts.conf 에
SetEnv       SERVER_TYPE dev  추가

2. cli를 이용하는 경우 OS의 환경변수를 설정한다.
리눅스인 경우

/etc/profile 에

export SERVER_TYPE=dev 추가

3. php 스크립트를 크론탭에서 사용하는 경우
/etc/crontab 파일에

export SERVER_TYPE=dev 추가


php에서는 세가지 모두 $_SERVER['SERVER_TYPE'] 로 값을 얻을 수 있다

ex)
if($_SERVER['SERVER_TYPE'] == 'prod') {

    $dbServer = '10.1.1.1';

}
else if($_SERVER['SERVER_TYPE'] == 'dev') {
    $dbServer = '10.1.1.2';
}

Posted by incree

2018/06/05 21:32 2018/06/05 21:32
,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/394

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

[MariaDB] 실행 계획 분석시 주의사항

위키북스 - Real MariaDB p.240~242


4.5.1 Select_type 칼럼의 주의 대상
DERIVED
DERIVED는 FROM 절에 사용된 서브 쿼리로부터 발생한 임시 테이블을 의미한다. 임시 테이블은 메모리에 저장될 수도 있고 디스크에 저장될 수도 있다. 일반적으로 메모리에 저장하는 경우에는 크게 성능에 영향을 미치지 않지만 데이터의 크기가 커서 임시 테이블을 디스크에 저장하면 성능이 떨어진다.


UNCACHEABLE SUBQUERY
쿼리의 FROM 절 이외의 부분에서 사용하는 서브 쿼리는 가능하면 MariaDB 옵티마이저가 최대한 캐시되어 재사용될 수 있게 유도한다. 하지만 사용자 변수나 일부 함수가 사용된 경우에는 이러한 캐시 기능을 사용할 수 없게 만든다. 이런 실행 계획이 사용된다면 혹시 사용자 변수를 제거하거나 다른 함수로 대체해서 사용 가능할지 검토해보는 것이 좋다.


DEPENDENT SUBQUERY
쿼리의 FROM 절 이외의 부분에서 사용하는 서브 쿼리가 자체적으로 실행되지 못하고, 외부 쿼리에서 값을 전달받아 실행되는 경우 DEPENDENT SUBQUERY가 표시된다. 이는 서브 쿼리가 먼저 실행되지 못하고, 서브 쿼리가 외부 쿼리의 결과 값에 의존적이기 때문에 전체 쿼리의 성능을 느리게 만든다. 서브 쿼리가 불필요하게 외부 쿼리의 값을 전달 받고 있는지 검토해서 가능하다면 외부 쿼리와의 의존도를 제거하는 것이 좋다.


4.5.2 Type 칼럼의 주의 대상
ALL, index
index는 인덱스 풀 스캔을 의미하며, ALL은 풀 테이블 스캔을 의미한다. 둘 다 대상의 차이만 있지 전체 레코드를 대상으로 하는 작업 방식이라서 빠르게 결과를 가져오기는 어렵다. 일반적인 OLTP 환경에 적합한 접근 방식은 아니므로 새로운 인덱스를 추가하거나 쿼리의 요건을 변경해서 이러한 접근 방법을 제거하는 것이 좋다.


4.5.3 Key 칼럼의 주의 대상
쿼리가 인덱스를 사용하지 못할 때 실행 계획의 Key 칼럼에 아무 값도 표시되지 않는다. 쿼리가 인덱스를 사용할 수 있게 인덱스를 추가하거나 WHERE  조건을 변경하는 것이 좋다.


4.5.4 Rows 칼럼의 주의 대상
• 쿼리가 실제 가져오는 레코드 수보다 훨씬 더 큰 값이 Rows 칼럼에 표시되는 경우에는 쿼리가 인덱스를 정상적으로 사용하고 있는지, 그리고 그 인덱스가 충분히 작업 범위를 좁혀 줄 수 있는 칼럼으로 구성됐는지 검토해보는 것이 좋다. 인덱스가 효율적이지 않다면 충분히 식별성을 가지고 있는 칼럼을 선정해 인덱스를 다시 생성하거나 쿼리의 요건을 변경해보는 것이 좋다.


• Rows 칼럼의 수치를 판단할 때 주의해야 할 점은 LIMIT가 포함된 쿼리라 하더라도 LIMIT의 제한은 Rows 칼럼의 고려 대상에서 제외된다는 것이다. 즉 "LIMIT 1"로 1건만 SELECT 하는 쿼리라 하더라도 Rows 칼럼에는 훨씬 큰 수치가 표현될 수도 있으며, 성능상 아무런 문제가 없고 최적화된 쿼리일 수도 있다는 것이다.


4.5.5 Extra 칼럼의 주의 대상

실행계획의 Extra 칼럼에는 쿼리를 실행하면서 처리한 주요 작업에 대한 내용이 표시되기 때문에 쿼리를 튜닝할 때 중요한 단서가 되는 내용이 많이 표시된다. 주요 키워드는 기억했다가 실행 계획상에 해당 단어가 표시될 때는 더 자세히 검토하는 것이 좋다.


4.5.5.1 쿼리가 요건을 제대로 반영하고 있는지 확인해야 하는 경우

• Full scan on NULL key
• Impossible HAVING(MariaDB 5.1 부터)
• Impossible WHERE(MariaDB 5.1 부터)

• Impossible WHERE noticed after reading const tables

• No matching min/max row(MariaDB 5.1 부터)

• No matching row in const table(MariaDB 5.1 부터)

• Unique row not found(MariaDB 5.1 부터)


위와같은 코멘트가 Extra 칼럼에 표시된다면 우선 쿼리가 요건을 제대로 반영해서 작성됐거나 버그의 가능성은 없는지 확인해야 한다. 또는 개발용 데이터베이스에 테스트용 레코드가 제대로 준비돼 있는지 확인해보는 것도 좋다. 이 항목들은 성능과 관계가 깊지 않고 단지 "그런 레코드가 없음"이라는 의미가 강하기 때문에 이 쿼리로 인한 버그의 가능성이 있을지를 집중적으로 검토하는 것이 좋다. 물론 쿼리가 업무적인 요건을 제대로 반영하고 있다면 무시해도 된다.

4.5.5.2 쿼리의 실행 계획이 좋지 않은 경우
• Range checked for each record (index map: N)
• Using filesort

• Using join buffer (MariaDB 5.1부터)

• Using temporary

• Using where


위와같은 코멘트가 Extra 칼럼에 표시된다면 먼저 쿼리를 더 최적화할수 있는지 검토해보는 것이 좋다. 마지막의 Using where는 사실 대부분의 쿼리에서 표시되는 경향이 있기 때문에 그냥 지나치기 쉬운데, 만약 실행 계획의 Rows 칼럼의 값이 실제 SELECT되는 레코드 건수보다 상당히 많은 경우에는 반드시 보완해서 Rows 칼럼의 값과 실제 SELECT 되는 레코드의 수의 차이를 최대한 줄이는 것이 중요하다. 쿼리의 실행 계획에서 이러한 문구가 사라질 수 있다면 최선이겠지만 그렇지 않더라도 성능상 허용가능하다면 넘어가도 좋을 듯하다. 단 반드시 자세히 검토해야한다는 사실을 잊지 말자.

4.5.5.3 쿼리의 실행 계획이 좋은 경우
• Distinct

• Using index

• Using index for group-by


여기에 표시된 항목은 최적화되어서 처리되고 있음을 알려주는 지표 정도로 생각하자. 특히 두 번째의 Using index는 쿼리가 커버링 인덱스로 처리되고 있음을 알려주는 것인데, MamDB에서 제공할 수 있는 최고의 성능을 보여줄 것이다. 만약 쿼리를 아무리 최적화해도 성능 요건에 미치지 못한다면 인덱스만으로 쿼리가 처리(커버링 인덱스)되는 형태로 유도해보는 것도 좋다.

Posted by incree

2018/04/28 11:40 2018/04/28 11:40
,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/393

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

[Android]TextView Outline text

public class IATOutLineTextView extends AppCompatTextView {
public IATOutLineTextView(Context context) {
this(context, null);
}

public IATOutLineTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public IATOutLineTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);

int textColor = this.getCurrentTextColor();

TextPaint paint = this.getPaint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.MITER);
paint.setStrokeMiter(10);
this.setTextColor(Color.parseColor("#ff0000"));
paint.setStrokeWidth(10);
super.onDraw(canvas);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(0);
this.setTextColor(textColor);
super.onDraw(canvas);
}
}

Posted by incree

2018/04/21 07:16 2018/04/21 07:16
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/392

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

[잡다] 소코반(창고지기) 풀이

SokobanTouch Alphabets(6 trials) - No.03

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지














Posted by incree

2018/04/15 04:59 2018/04/15 04:59
,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/391

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

MySQL Troubleshooting(MySQL 문제 해결 가이드) - P.152


트랜잭션이 기다리는 모든 락에 대한 정보 :
 SELECT * FROM INNODB_LOCK_WAITS

블럭된 트랜잭션의 목록 :
SELECT * FROM INNODB_LOCKS WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS)

또는
SELECT INNODB_LOCKS.* FROM INNODB_LOCKS JOIN INNODB_LOCK_WAITS ON (INNODB_LOCKS.LOCK_TRX_ID=INNODB_LOCK_WAITS.BLOCKING_TRX_ID)

특정 테이블에 대한 락의 목록 :
SELECT * FROM INNODB_LOCKS WHERE LOCK_TABLE='<데이터베이스_이름>.<테이블_이름>'

락을 기다리는 모든 트랜잭션의 목록 :
SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID,TRX_QUERY FROM INNODB_TRX WHERE TRX_STATE='LOCK WAIT'

Posted by incree

2018/04/08 01:13 2018/04/08 01:13
,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/390

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다



MPAndroidChart custom BarchartRenderer Example

차트에 배경 이미지 넣기
막대에 그라데이션 적용

package com.incree.mpandroidchart.custom.barchartrenderer.example;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;
import android.widget.SeekBar;
import android.widget.TextView;

import com.github.mikephil.charting.animation.ChartAnimator;
import com.github.mikephil.charting.buffer.BarBuffer;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import com.github.mikephil.charting.renderer.BarChartRenderer;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.Transformer;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
protected BarChart mChart;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);

mChart = (BarChart) findViewById(R.id.chart1);

mChart.setDrawBarShadow(false);
mChart.setDrawValueAboveBar(true);

mChart.getDescription().setEnabled(false);

setData();

mChart.setRenderer(new MyBarChartRenderer(mChart, mChart.getAnimator(), mChart.getViewPortHandler()));
}

private void setData() {

float start = 1f;

ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();

for (int i = 0; i < 12; i++) {
float mult = (500 + 1);
float val = (float) (Math.random() * mult);

yVals1.add(new BarEntry(i, val));
}

BarDataSet set1;

if (mChart.getData() != null &&
mChart.getData().getDataSetCount() > 0) {
set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0);
set1.setValues(yVals1);
mChart.getData().notifyDataChanged();
mChart.notifyDataSetChanged();
} else {
set1 = new BarDataSet(yVals1, "The year 2017");

set1.setDrawIcons(false);

set1.setColors(ColorTemplate.MATERIAL_COLORS);

ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);

BarData data = new BarData(dataSets);
data.setValueTextSize(10f);
data.setBarWidth(0.9f);

mChart.setData(data);
}
}

class MyBarChartRenderer extends BarChartRenderer {
public MyBarChartRenderer(BarDataProvider chart, ChartAnimator animator,
ViewPortHandler viewPortHandler) {
super(chart, animator, viewPortHandler);

initBuffers();
}

@Override
public void drawData(Canvas c) {
Drawable d = getResources().getDrawable(R.drawable.zzang);
d.setBounds(0, 0, c.getWidth(), c.getHeight());
d.draw(c);

super.drawData(c);
}

private RectF mBarShadowRectBuffer = new RectF();

@Override
protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) {
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());

mBarBorderPaint.setColor(dataSet.getBarBorderColor());
mBarBorderPaint.setStrokeWidth(Utils.convertDpToPixel(dataSet.getBarBorderWidth()));

final boolean drawBorder = dataSet.getBarBorderWidth() > 0.f;

float phaseX = mAnimator.getPhaseX();
float phaseY = mAnimator.getPhaseY();

// draw the bar shadow before the values
if (mChart.isDrawBarShadowEnabled()) {
mShadowPaint.setColor(dataSet.getBarShadowColor());

BarData barData = mChart.getBarData();

final float barWidth = barData.getBarWidth();
final float barWidthHalf = barWidth / 2.0f;
float x;

for (int i = 0, count = Math.min((int)(Math.ceil((float)(dataSet.getEntryCount()) * phaseX)), dataSet.getEntryCount());
i < count;
i++) {

BarEntry e = dataSet.getEntryForIndex(i);

x = e.getX();

mBarShadowRectBuffer.left = x - barWidthHalf;
mBarShadowRectBuffer.right = x + barWidthHalf;

trans.rectValueToPixel(mBarShadowRectBuffer);

if (!mViewPortHandler.isInBoundsLeft(mBarShadowRectBuffer.right))
continue;

if (!mViewPortHandler.isInBoundsRight(mBarShadowRectBuffer.left))
break;

mBarShadowRectBuffer.top = mViewPortHandler.contentTop();
mBarShadowRectBuffer.bottom = mViewPortHandler.contentBottom();

c.drawRect(mBarShadowRectBuffer, mShadowPaint);
}
}

// initialize the buffer
BarBuffer buffer = mBarBuffers[index];
buffer.setPhases(phaseX, phaseY);
buffer.setDataSet(index);
buffer.setInverted(mChart.isInverted(dataSet.getAxisDependency()));
buffer.setBarWidth(mChart.getBarData().getBarWidth());

buffer.feed(dataSet);

trans.pointValuesToPixel(buffer.buffer);

final boolean isSingleColor = dataSet.getColors().size() == 1;

if (isSingleColor) {
mRenderPaint.setColor(dataSet.getColor());
}

for (int j = 0; j < buffer.size(); j += 4) {

if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
continue;

if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
break;

if (!isSingleColor) {
// Set the color for the currently drawn value. If the index
// is out of bounds, reuse colors.
mRenderPaint.setColor(dataSet.getColor(j / 4));
}

c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
buffer.buffer[j + 3], mRenderPaint);

if (drawBorder) {
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
buffer.buffer[j + 3], mBarBorderPaint);
}

Drawable d = getResources().getDrawable(R.drawable.fade_red);
d.setBounds((int)buffer.buffer[j], (int)buffer.buffer[j + 1], (int)buffer.buffer[j + 2],
(int)buffer.buffer[j + 3]);
d.draw(c);
}
}

@Override
public void drawExtras(Canvas c) {
super.drawExtras(c);
/*
Paint p = new Paint();
p.setAlpha(90);

Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.zzang);
c.drawBitmap(image, 0, 0, p);
*/
}
}
}

https://github.com/PhilJay/MPAndroidChart


https://github.com/incree/MPAndroidChart-custom-BarChartRenderer-example












Posted by incree

2018/04/07 07:14 2018/04/07 07:14
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/389

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

Android gravity, layout_gravity dynamic programmatically

gravity : 자식 뷰를 어떻게 표시 할지
layout_gravity : 부모 뷰에 어떻게 표시할지

동적으로 추가할때 layout_gravity는 LayoutParams에 적용해야 하고
gravity는 View에 적용한다




LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
params.setGravity(Gravity.CENTER);
    setLayoutParams(params);

    setGravity(Gravity.CENTER);

Posted by incree

2018/03/20 12:01 2018/03/20 12:01
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/388

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다


전자정부프레임워크 프로젝트를 github 연동후 다음과 같은 에러가 나면
org.eclipse.jgit.api.errors.TransportException: Nothing to fetch.
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:139)
at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:253)
at org.eclipse.egit.core.op.PullOperation$1.run(PullOperation.java:97)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313)
at org.eclipse.egit.core.op.PullOperation.execute(PullOperation.java:128)
at org.eclipse.egit.ui.internal.pull.PullOperationUI.execute(PullOperationUI.java:139)
at org.eclipse.egit.ui.internal.pull.PullOperationUI$1.runInWorkspace(PullOperationUI.java:114)
at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Caused by: org.eclipse.jgit.errors.TransportException: Nothing to fetch.
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1087)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:130)
... 8 more


config 파일 [remote "origin"] 항목에

fetch = +refs/heads/*:refs/remotes/origin/*


를 추가한다.

이클립스에서 모든 프로젝트에 적용되게 하려면

Windows -> Preferences -> Team -> Git -> Configuration - Repository Settings 탭
-> Add Entry
Key : remote.origin.fetch
Value : +refs/heads/*:refs/remotes/origin/*

config 파일 전체 내용
[core]
symlinks = false
repositoryformatversion = 0
filemode = false
logallrefupdates = true
[remote "origin"]
url = git url
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master



Posted by incree

2018/02/11 13:08 2018/02/11 13:08
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/386

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

안드로이드 웹뷰 액티비티를 사용하고 정상적으로 종료하지 않았을때

fabric log


Crash Insights
Heads Up!
Unable to add window -- token is not valid; is your activity running?

Details:
This crash is usually caused by your app trying to display a dialog using a previously-finished Activity as a context. For example, this can happen if an Activity triggers an AsyncTask that tries to display a dialog when it is finished, but the user navigates back from the Activity before the task is completed.

s crash is usually caused by your app trying to display a dialog using a previously-finished Activity as a context. For example, this can happen if an Activity triggers an AsyncTask that tries to display a dialog when it is finished, but the user navigates back from the Activity before the task is completed.
Resources:
1. Android – Displaying Dialogs From Background Threads
2. Error : BinderProxy@45d459c0 is not valid; is your activity running?

Fatal Exception: android.view.WindowManager$BadTokenException
Unable to add window -- token android.os.BinderProxy@d21dce2 is not valid; is your activity running?
 Raw Text
android.view.ViewRootImpl.setView (ViewRootImpl.java:890)
com.android.webview.chromium.Ap.handleJsAlert (WebViewContentsClientAdapter.java:355)
org.chromium.android_webview.AwContentsClientBridge$$Lambda$2.run (Unknown Source:3)
android.os.Handler.handleCallback (Handler.java:751)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)
Show all 44 Threads

이와 같은 에러가 나면서 앱이 크래쉬 되는 경우가 있다.

webview activity를 종료한 후 결제등의 화면에서 세션이 종료되는 것을 알리는 alert를 띄워줄때 발생하는 경우가 있다.

activity만 종료했기 때문이고, webview도 distory 해주면 이 에러는 해결된다.

백버튼이나 액티비티 종료 버튼을 눌러서 종료할때

다음과 같이 webview를 distory 한후 activity를 finish 한다.

@Override
public void onBackPressed() {
webView.destroy();
finish();
}


사용자 삽입 이미지



Posted by incree

2018/01/26 23:16 2018/01/26 23:16
,
Response
0 Trackbacks , 0 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/385

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

« Previous : 1 : 2 : 3 : 4 : 5 : ... 15 : Next »