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

                1. ByteBuffer
                EL在從Lingoes詞典文件中提取數(shù)據(jù)時, 需要使用InflaterInputStream對象解壓原始數(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;
                }

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

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


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

                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();
                    }
                }

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

            posted on 2013-09-02 00:22 codejie 閱讀(1189) 評論(0)  編輯 收藏 引用 所屬分類: G7EL

            公告

            Using C++

            導航

            統(tǒng)計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            精品久久久久久中文字幕大豆网| AAA级久久久精品无码区| 热RE99久久精品国产66热| 久久久久亚洲AV成人网人人网站| 国产精品午夜久久| 久久艹国产| 久久久久亚洲AV无码网站| 一本一道久久精品综合| 97香蕉久久夜色精品国产| 潮喷大喷水系列无码久久精品 | 久久夜色精品国产亚洲| 人妻精品久久无码区| 精品久久久久久综合日本| 一本大道久久香蕉成人网| 久久精品无码一区二区无码| 久久精品综合一区二区三区| 久久精品国产第一区二区三区| 人妻系列无码专区久久五月天| 国产精品久久久久a影院| 久久99精品国产麻豆宅宅| 中文字幕亚洲综合久久菠萝蜜| 久久久久久噜噜精品免费直播| 久久久久亚洲AV无码永不| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 精品久久久久久无码中文野结衣| 国产精品美女久久久| 亚洲伊人久久综合中文成人网| 97久久国产亚洲精品超碰热| 亚洲国产成人久久综合碰| 99久久国产免费福利| 99久久中文字幕| 色婷婷狠狠久久综合五月| 精品久久久久久无码中文野结衣| 国产Av激情久久无码天堂| 免费一级做a爰片久久毛片潮| 国产午夜精品理论片久久| 粉嫩小泬无遮挡久久久久久| 亚洲国产另类久久久精品| 婷婷久久久亚洲欧洲日产国码AV| 亚洲欧美成人久久综合中文网| 丁香五月综合久久激情|