天天看點

翻翻git之---低記憶體損耗,簡單易用的漢字->拼音轉換庫 TinyPinyin

轉載請注明出處王亟亟的大牛之路

這周都在捯饬RN和搭建公司内部的開發環境,沒怎麼好好學習,正好看到之前收入的一個中文轉拼音的庫,體驗了下推薦給大家,先安利:https://github.com/ddwhan0123/Useful-Open-Source-Android

從這篇開始,之後的每篇都會提幾個面試題,溫顧下知識(見文章尾,妹子前面的“面試題”部分)

首先,為什麼推薦給大家這個庫而不是廣泛使用的jpinyin,理由有以下幾個

生成的拼音不包含聲調,也不處理多音字,預設一個漢字對應一個拼音;

無需初始化,執行效率很高(Pinyin4J的4倍);

很低的記憶體占用(小于30KB)。

How to use?

buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    compile 'com.github.promeg:tinypinyin:1.0.0' 
  }
}
           

它類似于一個工具類,方法都是靜态的,不用初始化,我們來看下作者提供的2個方法

public static String toPinyin(char c)//中文轉拼音,如果不是中文就  return String.valueOf(c);


 public static boolean isChinese(char c) //用于判斷是否是中文
           

運作效果

翻翻git之---低記憶體損耗,簡單易用的漢字->拼音轉換庫 TinyPinyin
翻翻git之---低記憶體損耗,簡單易用的漢字->拼音轉換庫 TinyPinyin

來簡單地看看實際使用的代碼

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView resultTV;
    private EditText inputET;
    private Button submitBtn;

    private String pinYin = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.submitBtn:
                pinYin = inputET.getText().toString().trim();
                if (!pinYin.isEmpty()) {
                    resultTV.setText(Pinyin.toPinyin(pinYin.charAt()));
                }
                inputET.setText("");
                break;
            default:
                break;
        }
    }

    private void init() {
        resultTV = (TextView) findViewById(R.id.resultTV);
        inputET = (EditText) findViewById(R.id.inputET);
        submitBtn = (Button) findViewById(R.id.submitBtn);
        if (submitBtn != null) {
            submitBtn.setOnClickListener(this);
        }
    }
           

一個按鈕,一個輸入欄,一個展示View,把簡單的邏輯實作了下,其實主要的代碼就一行:

Pinyin.toPinyin(pinYin.charAt(0))

既然使用簡便,博文篇幅也不長,那就來看看這個類最重要的方法是toPinyin如何實作的吧(解釋都在注釋裡)

public static String toPinyin(char c) {
         //判斷是否中文
        if (isChinese(c)) {
            //判斷Unicode編碼
            if (c == PinyinData.CHAR_12295) {
                return PinyinData.PINYIN_12295;
            } else {
                return PinyinData.PINYIN_TABLE[getPinyinCode(c)];
            }
        } else {
            return String.valueOf(c);
        }
    }
           

先判斷Unicode是否漢子,如果是的話看是否等于“〇”(其實這個字我不認識。。。。查了查是 Ling),如果不是就去“詞典”裡取讀音。

詞典裡大概是

"", "A", "AI", "AN", "ANG", "AO", "BA", "BAI"

長得像這樣的一對、堆讀音,就不詳細舉例子了。

作者沒有做讀音或者聲調的判斷,如果需要可以看https://github.com/stuxuhai/jpinyin

總結:這是一個使用簡單,性能上佳,實作友善的“工具類”,在搜尋/通訊錄等子產品都會用得到,收錄下來以便不時之需哦!

面試題 1 service是否可以打開屬于Activity的dialog?

**答:**service中彈出dialog時,如果寫和activity同樣的代碼時會報錯.

那麼如何解決這個問題呢?

首先,需要授權

android.permission.SYSTEM_ALERT_WINDOW

然後

dialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));

可參考文章 http://www.cnblogs.com/shaweng/p/3990748.html

面試題2 殺死程序廣播還在嗎

廣播還在的,廣播資訊在安裝應用後,是注冊到系統的服務中的,是以不管應用程序在不在,廣播都是會被吊起來的。(相關關鍵詞,動态廣播/靜态廣播)

例子位址:https://github.com/ddwhan0123/BlogSample/tree/master/PinYinDemo

上面那部分是最近想到添加的,如果大家有什麼疑問可以給我留言或者微信告知我(活人,不是公衆号)

翻翻git之---低記憶體損耗,簡單易用的漢字->拼音轉換庫 TinyPinyin
翻翻git之---低記憶體損耗,簡單易用的漢字->拼音轉換庫 TinyPinyin