웹뷰내 플래쉬 문제로 앱이 사망 

오류 Failed change in drawing model due to missing context


- 하드웨어 가속으로 처리 하였으나 바탕이 검정색으로 오류



However, if in your AndroidManifest.xml contains:

             android:hardwareAccelerated="true"
아래 코드를 통해 수정...
           webView.setBackgroundColor(0x00FFFFFF);



webView's background, for some reason, does not change to transparency.
(It took me while to figure this out!)

This is how to disable hardware acceleration on the view that contains webview:

             view.setLayerType(View.LAYER_TYPE_SOFTWAREnull);

,

전자담배 펌글

from Board/Freeboard 2012. 6. 16. 23:28
한국금연운동협회에서2012년 4월 12일에 게시 된기사입니다. 미국 식약청의 전자담배 보고서에 대한 비판 (Globalink- E-cigarettes Discussions-March 26, 2012) by Mrs. Elaine Keller 미국식약청이2009년 7월에 두가지브랜드의 18개 전자담배를조사한결과를발표한후여러 나라에서전자담배를판매금지하였다. 예를들 어우루과이,콜럼비아,파나마그리고아르헨티 나등이다. 캐나다와오스트레일리아는전자담 배기기의판매는금지하지않았지만니코틴을포 함하는액체의사용을금하였다. 미식약청의발표에의하면전자담배카트리지 속에는nitrosamines를 포함하는발암물질이포 함되어있고,diethylene glycol과 같은독성물질 들이포함되어있다고했다. 당일식약청의전자 담배에대한보고서를발표한목적은전자담배 를사용하면암이발생하고또한사용자에게독 을공급한다는것을알리기위해꾀를부린것으 로보인다. 발표내용을보면틀린점은없다. 그러나그보고 서를읽은사람들은잘못된판단을하게만드는 데는효과적으로작용한것으로보인다. 물론전자담배속에는발암물질이들어있다. 그 러나그표현은nitrosamines를 포함하는발암물 질들이라고되어있다. 즉그이외에도여러종류 의발암물질들이포함되어있는것같이표현한 것이다. 실제로유일하게발견된발암물질은담 배속에만들어있는Tobacco-specific nitrosamines(TSNAS) 한종류다. 더욱식약청은 발견된발암물질의양에대해서는언급하지않았 다. 다른연구기관에서측정한자료에의하면1.6% 의니코틴을포함하는1gm 의액체에TSNAS 8 nanogram이 포함되어있는것으로밝혀졌다. 4mg짜리 니코틴패치에도TSNAS 가8 nanograms가 포함되어있다. 8 nanogram은 전 혀암을일으킬용량이아니기때문에니코틴패 치에아무경고를하지않고있다. 그러나보통담 배한갑에는무려126,000 nanograms가 포함되 어있다. 우습게도전자담배를금지한나라에서는전자담 배로부터흡연자들을보호하기위해서내린조치 라고했다. 8 nanogram의 발암물질을없애수십 만의nanogram의 발암물질들을매일흡입하는 사람들을보호한다는웃지못할일이일어난것이 다. 식약청의보고서에는독성물질들(Toxic chemicals)이라고 복수명사로사용함으로서여 러독성물질들을발견한것처럼기술하였다. 그 러나실제로는한가지독성물질만을찾아낸것 으로알려졌다. 그나마도카트리지(cartridges) 하나의액체전체에속에1%에 해당되는양이다. 하나의카트리지의액체총양은0.5gm에 불과 하다. 만일평균체중의전자담배사용자가카트 리지속의액체를마신다면그속에들어있는 diethylene glycol에 의하여치명상을입으려면 하루에수천개카트리지속의용액을전부마셔 야한다는계산이다. 그러나전자담배사용자중아무도그속에들어 있는용액을마시는사람은없다. 사용자는이액 체를가열하여나타나는증기를흡입하는것이 다. 식약청이증기를검사한것으로보이지않는 다. 카트리지에따라,낮은수준,중간수준높은 수준그리고0 수준의각기다른니코틴용량이 검출되고있지만식약청은그중에서도니코틴이 전혀포함되지않은것은검사하지도않았다. 담 배속에종종포함되어있는순수하지않은니코 틴인nicotine-N-oxide, nornicotine, anabasine 그리고myosine은 전혀검출되지않았다. 베타 nicotyrine은 모든Njoy 회사에서생산한카트리 지에서고르게검출되었으나Smoking Everywhere 브랜드에서는전혀검출되지않았 다. (http://www.fda.gov/downloads/Drugs/ScienceResearch/UCM173250... ) 보고서에서는증기에서TSNA의발견여부에대 해서는언급이없다. 또한베타-Nicotyrine은 독 성도없고발암물질도아니다. 만일흡연자가전자담배로교체하여니코틴이들 어있는카트리지를사용하면니코틴에노출되는 것이다. Health New Zealand의 검사에의하면 1.6%의 니코틴을포함하는카트리지를흡입하면 보통담배를흡입했을때의1/10에서 1/3의 니코 틴양을흡입하게되는것이다. 흡연자가지속적 으로흡연하면니코틴,타르,미립자(particulate), 독성가스그리고태우는과정에서생성되는수 천종의화학물질에노출되는것이다. 이중에수 천종은독성이있는것으로알려졌고수십가지 는발암물질이다. 마일당신이사랑하는사람이담배를끊을수없 다면전자담배로바꾸라고할것인지아니면보 통담배를피우라고할것인가? 생가해보기바란 다. 식약청의보고서를보고전자담배를불법화한나 라들이불상하다는생각이든다. (KIS) 지금전세계는연초회사들과전자담배회사들간 에치열한전쟁중에있습니다. 2003년중국에서개발된이후전자담배는전세 계담배시장을무서운속도로잠식해가고있습니 다. 이제까지1000년이상그생명을유지해온연초 담배를대체할수있는물건은전자담배외에는 전혀존재하지않았거든요. (일부는전자담배를 21세기최고의발명품이라고칭송을합니다. ^^) 글로벌연초회사들은현재전세계가연초를합 법적인마약으로규정하여대대적인금연정책을 펼치고있는사회분위기로인해수익악화의심 각한위기의식을가지고있으며전자담배를회사 의존폐를위협하는악(?)으로규정하고있습니 다. 절대끊을수없다는말이있을정도로무서운중 독성을가지고있는연초를대체할수있는것이 존재한다는사실만으로도연초회사들의입장에 선기분좋을일이아니기때문이죠. 그래서수백조의자금력을가진글로벌연초회사 들의개노릇을하고있는미국(특히공화당)을 위시해그아래딸랑이국가들(캐나다,우루과이, 파나마,아르헨티나,오스트렐리아 등)이전자담 배기기및전자담배액상을불법화여그확산을 막으려고하고있습니다. 다들아시겠지만글로벌연초회사들의자금력과 정치력은상상을초월합니다. 예를들어얼마전에미국에서담배갑에폐암경 고그림경구를넣으려다실패했다는기사보셨을 겁니다. (현재미국식약청에서는그에불복하여 항소심이진행중이라는군요. 제개인적인생각 이지만미국이뒤집어지지않는이상승소율은 0%라고확신합니다.) 그리고공화당의표밭인미국의뉴욕주는이미 전자담배를마약으로규정하여불법화하였습니 다. 전자담배길거리에서피우다가적발되면경 찰로부터제재를받습니다. ㅠㅠ뉴욕가시는전 담유저분들조심하세요. 공항에서압수당할수 도있습니다. ㅠㅠ 게다가다른한편으로글로벌연초회사들은전자 담배의유해성을부각시키기위해서방송사,신 문사,연구기관,정부들에게수십조의로비자금 을뿌려가며언론을조장하려는끊임없는시도를 하고있습니다. 전자담배불법화노력에도불구근절시키지못할 바에는차라리일반시민들에게전자담배의유해 성을부각시켜인지토록만들어서전자담배의사 용인구를제한함과동시에시장잠식을막아보자 는심산인것이지요. 전자담배를불법화하기전에연초부터불법화하 여근절시키는것이우선인데담배는그냥놔두 고전담은불법화한다... 무언가좀이상하진않 나요? ^^ 물론이러한연초회사들의중상모략에당하고만 있을회사는없겠죠. 전자담배회사들측의반격 도거셉니다. 지금도현재그안정성을입증하기 위해엄청난노력을기울이고있으니까요. 하지만연초회사의자금력아래놓여있는공공연 구기관들(심지어국가기관까지도)은우선적으로 전자담배의안정성을검증해야함에도불구하고 어떻게는전자담배의유해성만을알리는데중점 을두고있다는겁니다. 대한민국만을놓고봐도알수있습니다. 일부전 담회사들측해서공식적으로안전성을검증해달 라고수십차례요구를해도어떤공공연구기관 에서도제대로받아들여지지않고있는것이현 실입니다.. 슬프죠.. 심지어전자담배의유해성에 대한편파보도들의반박기사를요청하여도우리 나라언론사어느곳에서도이를흔쾌히받아들 이고있지않습니다. (네이버뉴스에전자담배옹 호하는글한자만올려도바로삭제됩니다. 제가 직접경험한일입니다.) 계란으로바위치기라는말씀아시죠? 수백조의 자금력과정치력을가지고있는연초회사들에비 하면전자담배회사들의규모는구멍가게수준입 니다. 즉싸움이안된다는것이지요. 이종격투기 로따지면초딩(전담회사)이표도르(연초회사)와 붙는식이라고나할까요...^^ 하지만다행히일부국가들(영국,뉴질랜드등)에 서는연초로인하여사망하는수십만의인명을 구제하기위해전자담배를연초의대체제로권장 하려하고있습니다. 뉴질랜드의보건복지부는“Electronic cigarette is far safer than smoking tabaccos" (전자담배 는연초를피우는것보다훨씬더안전하다)라고 발표를하였습니다. 출처: http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&objectid=10724283 또한영국국무회의산하Nudge Unit(The Cabinet Office's Behavioural Insight Team : 행 동관찰팀)에서는“독성물질이나발암물질없이 니코틴만을공급하는새로운기술을적용한또는 새로운담배제품의개발을장려해야한다고하면 서규제체계를완화하여새로운제품이개발되도 록장려해야한다”고발표했습니다.(한국금연운 동협회,금연뉴스란,“영국정부무연담배도입긍 정적고려”기사에서발췌하였습니다) 대한민국은미국딸랑이국가들중선두주자라 해도과언이아닐만큼“충성,! 예! 알겠습니닷! 받두러워~ 총!!!” 을외쳐대는나라입니다. 미국 의52번째주(미국은50개의주와1개의특별자 치구로나뉘어져있습니다.)라고미국애들조차 비웃는꼴불견중의꼴불견인나라가대한민국입 니다. (제가미국8년살다왔습니다. ^^) 대한민 국 국민의 한사람으로써 씁쓸하고 창피한 일 이죠.. ㅠㅠ 과연그런한대한민국은어느쪽에붙을까요? ᄏ ᄏᄏ 다행히대한민국은아직까지는전자담배가불법 이아닙니다. 휴우~ 마지막으로전자담배냐연초냐하는것은대한민 국헌법에명시되어있듯이자신의자유선택의지 에달려있습니다. 다만겉으로들어나는것들이전부진실이라고 생각하지는마시기바랍니다. 이세상에겉으로 진실인양떠드는것중진실은없습니다. 무엇이 옳은가에대한선택은자신에게있습니다. 무엇이불편한진실인지그것은본인들의판단에 맡깁니다. PS : 정말웃기는건전자담배가유해하다는주장 을하고있는나라들중어떤나라도전자담배만 을가지고폄하할뿐이지연초보다해롭다는주 장을하는곳은단한군데도없습니다. 대한민국만빼구요..ᄏᄏᄏᄏᄏᄏᄏᄏᄏ KT&G 정말대단한회사입니다. 그쵸? ^^ 스펀지.. 짱 먹으세욧!!! 사랑합니다~ ^^;;
,

android swipe action

from Develop/Android 2012. 6. 15. 01:13


public class ListNewsActivity extends Activity implements OnGestureListener {


String TAG = "ListNewsActivity";


private static final int SWIPE_MIN_DISTANCE = 120;

private static final int SWIPE_MAX_OFF_PATH = 250;

private static final int SWIPE_THRESHOLD_VELOCITY = 200;


private static final int DIALOG_PLEASE_WAIT = 100;

private GestureDetector gestureDetector;

View.OnTouchListener gestureListener;


private Animation slideLeftIn;

private Animation slideLeftOut;

private Animation slideRightIn;

private Animation slideRightOut;


private static int MAX_STREAMS = AppSettings.getStreamList().size();


Context context;


ViewFlipper flipper;


StreamHeader header;


int currentStreamIndex = 0;


ArrayList<StreamNav> navList = new ArrayList<StreamNav>();

ArrayList<StreamGridView> gridList = new ArrayList<StreamGridView>();



/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {


    context = getApplicationContext();

    super.onCreate(savedInstanceState);

    setContentView(R.layout.stream);


    if (AppSettings.userToken == null) {

        AppSettings.getUserToken(context);

    }


    header = (StreamHeader) findViewById(R.id.stream_header);

    setHeaderTitle();


    flipper = (ViewFlipper)findViewById(R.id.stream_flipper);


    boolean loadData = false;

    Log.v(TAG, "No. of streams: " + String.valueOf(AppSettings.getStreamList().size()));

    for (Stream stream : AppSettings.getStreamList()) {

        Log.v(TAG, "Checking Stream  " + stream.getName());

        if (stream.getPosts() == null || stream.getPosts().size() == 0) {

            loadData = true;

            Log.v(TAG, "Empty Stream for " + stream.getBlogId() + ". Data will be loaded.");

            break;

        }

        else {

            Log.v(TAG, "Stream " + stream.getName() + " is populated. Posts: " + String.valueOf(stream.getPosts().size()));

        }

    }


    setupNavAndGrids();


    if (loadData) {

        new LoadStreamTask().execute();

    }

    else {

        populateGrids();

    }


    slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.stream_flipper_slidein_from_right);

    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.stream_flipper_slideout_to_left);

    slideRightIn = AnimationUtils.loadAnimation(this, R.anim.stream_flipper_slidein_from_left);

    slideRightOut = AnimationUtils.loadAnimation(this, R.anim.stream_flipper_slideout_to_right);


    gestureDetector = new GestureDetector(new MyGestureDetector());

    gestureListener = new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {


            if (gestureDetector.onTouchEvent(event)) {

                return true;

            }

            return false;

        }

    };


}


public void setupNavAndGrids() {


    LinearLayout llNav = (LinearLayout) findViewById(R.id.stream_nav_layout);


    View.OnClickListener navOnClickListener = new View.OnClickListener() {


        @Override

        public void onClick(View v) {


            StreamNav nav = (StreamNav)v;

            navigateToStream(nav.getStreamIndex());


        }

    };


    for (int i = 0; i < MAX_STREAMS; i++) {

        StreamNav nav = new StreamNav(context, null);

        nav.setStreamIndex(i);

        nav.setOnClickListener(navOnClickListener);

        navList.add(nav);

        llNav.addView(nav);


        StreamGridView gv = new StreamGridView(context, null);

        gv.setOnTouchListener(gestureListener);

        gridList.add(gv);


        flipper.addView(gv);


    }


    navList.get(0).setSelected(true);


}


void navigateToStream(int newStreamIndex) {


    for (StreamNav nav : navList) {

        if (nav.getStreamIndex() == newStreamIndex) {

            nav.setSelected(true);

        }

        else {

            nav.setSelected(false);

        }

    }

    Log.v(TAG, "Navigate To Stream: currentStreamIndex=" + String.valueOf(currentStreamIndex) + " newStreamIndex " + String.valueOf(newStreamIndex));

    if (currentStreamIndex < newStreamIndex) {

        int ctr = newStreamIndex - currentStreamIndex;

        for (int i = 0; i < ctr; i++) {

            showNext();

        }

    }

    else {

        int ctr =  currentStreamIndex - newStreamIndex;

        for (int i = 0; i < ctr; i++) {

            showPrevious();

        }

    }

}


public void showNext() {

    Toast.makeText(context, "Show Next Page for Flipper", Toast.LENGTH_LONG);

    flipper.setInAnimation(this, R.anim.stream_flipper_slidein_from_right);

    flipper.setOutAnimation(this, R.anim.stream_flipper_slideout_to_left);

    flipper.showNext();

    setStreamIndex(1);

    setHeaderTitle();

    }


public void showPrevious() {

    Toast.makeText(context, "Show Previous Page for Flipper", Toast.LENGTH_LONG);

    flipper.setInAnimation(this, R.anim.stream_flipper_slidein_from_left);

    flipper.setOutAnimation(this, R.anim.stream_flipper_slideout_to_right);

    flipper.showPrevious();

    setStreamIndex(-1);

    setHeaderTitle();

}


void setStreamIndex(int step) {

    if (step == 1) {

        if (currentStreamIndex == MAX_STREAMS) {

            currentStreamIndex = 0;

        }

        else {

            currentStreamIndex++;

        }

    }

    else {

        // -1 which means previous

        if (currentStreamIndex == 0) {

            currentStreamIndex = MAX_STREAMS - 1;

        }

        else {

            currentStreamIndex--;

        }

    }

}


void setHeaderTitle() {

    header.setTitle(AppSettings.getStreamList().get(currentStreamIndex).getName());

}


void populateGrids() {

    int pos = -1;

    for (StreamGridView sgv : gridList) {

        pos++;

        Log.v(TAG, "Loading Stream for " + AppSettings.getStreamList().get(pos).getName() + "; Posts: " + String.valueOf(AppSettings.getStreamList().get(pos).getPosts().size()));

        ArrayList<Post> posts = AppSettings.getStreamList().get(pos).getPosts();

        sgv.adapter = new LazyPostItemAdapter(ListNewsActivity.this, posts, gestureListener);

        sgv.gvStream.setAdapter(sgv.adapter);


    }

}

class LoadStreamTask extends AsyncTask<Void, String, Void> {


    @Override

    protected void onPreExecute() {

        super.onPreExecute();

        showDialog(DIALOG_PLEASE_WAIT);


    }


    @Override

    protected Void doInBackground(Void... unused) {


        for (Stream stream : AppSettings.getStreamList()) {


            if (stream.getBlogId().equalsIgnoreCase("popular")) {

                stream.setPosts(Post.getPopularStream());

            }

            else if (stream.getBlogId().equalsIgnoreCase("recent")) {

                stream.setPosts(Post.getRecentStream());

            }

            else {

                Blog blog = Blog.getBlog(stream.getBlogId());

                stream.setPosts(Post.getPostsForBlog(blog));

            }

        }


        return null;

    }


    @Override

    protected void onPostExecute(Void unused) {


        populateGrids();

        dismissDialog(DIALOG_PLEASE_WAIT);

    }

}


@Override

protected Dialog onCreateDialog(int id) {

    switch (id) {

        case DIALOG_PLEASE_WAIT:

            ProgressDialog mProgressDialog;

            mProgressDialog = new ProgressDialog(this);

            mProgressDialog.setMessage("Loading Streams...");

            mProgressDialog.setCancelable(false);

            mProgressDialog.show();

            return mProgressDialog;

        default:

            return null;

    }

}


class MyGestureDetector extends SimpleOnGestureListener {

    @Override

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        Log.v(TAG, "onFling");

        try {

            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)

                return false;

            // right to left swipe

            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                flipper.setInAnimation(slideLeftIn);

                flipper.setOutAnimation(slideLeftOut);

                flipper.showNext();

            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                flipper.setInAnimation(slideRightIn);

                flipper.setOutAnimation(slideRightOut);

                flipper.showPrevious();

            }

        } catch (Exception e) {

            // nothing

        }

        return false;

    }

}


@Override

public boolean onTouchEvent(MotionEvent event) {

    if (gestureDetector.onTouchEvent(event))

        return true;

    else

        return false;

}



@Override

public boolean onDown(MotionEvent e) {

    // TODO Auto-generated method stub

    return false;

}



@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

        float velocityY) {

    // TODO Auto-generated method stub

    return false;

}



@Override

public void onLongPress(MotionEvent e) {

    // TODO Auto-generated method stub


}



@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,

        float distanceY) {

    // TODO Auto-generated method stub

    return false;

}



@Override

public void onShowPress(MotionEvent e) {

    // TODO Auto-generated method stub


}



@Override

public boolean onSingleTapUp(MotionEvent e) {

    // TODO Auto-generated method stub

    return false;

}

,