• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            EL : be able to support 2.3.x again


                EL 1.2中新增了詞典功能, 急著release, 就沒有在2.3.x下測(cè)試 (當(dāng)然了, 我的G7被我刷成4.2.2之后, 也沒有2.3.x的環(huán)境了..), 編譯沒有問(wèn)題, 4.x上都OK, 然后就release了... 唉, 債總是要連本帶利地歸還的, 現(xiàn)實(shí)如此, 敲字亦是如此啊...因此這個(gè)周末, 整個(gè)周末都在修改EL無(wú)法在android 2.3.x上運(yùn)行的問(wèn)題.
                知道Android有版本碎化問(wèn)題, 只是沒想到這么'細(xì)節(jié)', 不碰到那真是根本想不到啊...還是前年做IOS好, 就沒考慮版本問(wèn)題,當(dāng)然也可能沒碰到. 不吐槽了, 敲字的人嘛, 抱怨不能解決問(wèn)題啊, 還得靠review/debug...
             
                這次發(fā)現(xiàn)了兩處不兼容的地方, 一個(gè)是java語(yǔ)言層面的, 另外一個(gè)則是android控件相關(guān)的.

                1. ByteBuffer
                EL在從Lingoes詞典文件中提取數(shù)據(jù)時(shí), 需要使用InflaterInputStream對(duì)象解壓原始數(shù)據(jù), 代碼如下:

                private static int decompressBlock(ByteBuffer in, int size, byte[] out) {
                    final Inflater inflater = new Inflater();
                    
                    byte[] a = null;
                    if (in.hasArray()) {
                        a = in.array();
                    } else {
                        a = new byte[size];
                        in.position(0);
                        in.get(a, 0, size);
                    }
                    final InflaterInputStream stream = new InflaterInputStream(new ByteArrayInputStream(a, 0, size), inflater, size);
                    
                    try {
                        while(stream.read(out) > 0);
                    } catch (IOException e) {
                        return -1;
                    }
                    inflater.end();
                    return 0;
                }

                此對(duì)象的一個(gè)傳入?yún)?shù)為InputStream, 這樣正好將ByteButter對(duì)象數(shù)組化為byte[]后, 構(gòu)造出一個(gè)ByteArrayInputStream實(shí)例傳入. 那么ByteBuffer常用且推薦的方式就是直接調(diào)用其array()方法, 這樣就無(wú)需在申請(qǐng)和構(gòu)造個(gè)新的byte[]空間了.
                問(wèn)題就在這里, 在android 2.3.x中, ByteBuffer對(duì)象是不支持直接數(shù)組化的, 在調(diào)用arry()時(shí), 會(huì)拋出NotSupportedException異常的. 因此為了保持兼容就需要在數(shù)組化前使用hasArray()方法檢查是否可以數(shù)組化, 如果不能, 那就要重新申請(qǐng)數(shù)組空間了.

                2. PopupMenu
                EL在播放時(shí), 支持快速跳轉(zhuǎn)到ESL課程的指定位置上. 如下圖所示.


                指定位置的選擇菜單是通過(guò)PopupMenu實(shí)現(xiàn)的, 但這個(gè)控件是在API 11才有的, 意味著低于HONEYCOMB版本的2.3.x平臺(tái)是沒法使用的. 實(shí)際這個(gè)問(wèn)題可以早點(diǎn)發(fā)現(xiàn)的, 但我就是懶了, 以后relase前, 還是需要運(yùn)行下Android Lint的.
                上圖可以看出在兩種平臺(tái)下, 這個(gè)'PopupMenu'是不一樣的, 那是因?yàn)?.3.x平臺(tái)上, 我是用PopupWindow控件模擬了類似PopupMenu的功能. 以后有時(shí)間看看能不能搞的UI也一樣就好了.
                這種控件上的不兼容, 可以使用不同平臺(tái)下運(yùn)行不同代碼來(lái)解決.

                private void showPopupMenu(View v) {

                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
                        
                        PopupMenu pm = new PopupMenu(getELActivity(), v);
                        pm.getMenuInflater().inflate(R.menu.fragment_show_pop, pm.getMenu());
                        pm.getMenu().getItem(0).setEnabled(audioSlowDialog != -1);
                        pm.getMenu().getItem(1).setEnabled(audioExplanation != -1);
                        pm.getMenu().getItem(2).setEnabled(audioFastDialog != -1);
                        
                        pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                            @Override
                            public boolean onMenuItemClick(MenuItem item) {
                                return onNavigate(item.getItemId());
                            }
                            
                        });
                        pm.show();
                        
                    } else {        
                        final ShowPopWindow win = new ShowPopWindow(getELActivity(), v);
                        win.setItemEnable(0, (audioSlowDialog != -1));
                        win.setItemEnable(1, (audioExplanation != -1));
                        win.setItemEnable(2, (audioFastDialog != -1));

                        win.setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                onNavigate(v.getId());
                                win.dismiss();
                            }

                        });
                        win.show();
                    }
                }

                本來(lái)想著更新下修改好的EL版本趕緊release了, 畢竟2.3.x還占有30%左右的份額, 是不能放棄的部分. 但還是有些心虛, 所以啊, 再檢查下, 明天再說(shuō)吧..(整個(gè)周末都在fix兼容問(wèn)題, 頭昏眼花啊, 睡覺去了...唉, 畢竟java沒有C++玩的那么久, 很多基本的語(yǔ)言級(jí)別的問(wèn)題都不清楚, 還要多敲敲才行啊..)

            posted on 2013-09-02 00:22 codejie 閱讀(1181) 評(píng)論(0)  編輯 收藏 引用 所屬分類: G7 、EL

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            熟妇人妻久久中文字幕| 久久综合给合综合久久| 久久综合给合久久狠狠狠97色 | 亚洲va中文字幕无码久久| 亚洲精品乱码久久久久66| 久久精品人人做人人爽电影蜜月| 国产精品福利一区二区久久| 国产精品女同一区二区久久| 久久婷婷色综合一区二区| 久久99久久99小草精品免视看| 国内精品久久久久影院网站| 久久人人爽人爽人人爽av| 亚洲精品乱码久久久久久自慰| 亚洲国产成人久久精品影视| 亚洲国产日韩欧美久久| 久久国产精品久久精品国产| 久久精品国产AV一区二区三区| 99久久国产综合精品网成人影院| 亚洲人成网亚洲欧洲无码久久| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 亚洲国产精品无码久久SM| 中文字幕久久欲求不满| 亚洲综合久久久| 久久精品二区| 日本久久久精品中文字幕| 亚洲精品无码久久久久去q| 日本欧美国产精品第一页久久| 国产精品久久久久久一区二区三区| 中文精品99久久国产| 久久精品国产精品亚洲人人| 久久最近最新中文字幕大全| 国产情侣久久久久aⅴ免费| 久久久久久久97| 亚洲精品无码久久久久去q| 伊人色综合久久天天人守人婷| 久久精品国产一区二区三区不卡| 69SEX久久精品国产麻豆| 伊人久久大香线蕉av不变影院| 久久人人爽人人人人爽AV| 亚洲精品第一综合99久久| 亚洲人成无码www久久久|