天天看点

翻翻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