上一篇文章講到可以新增的一些功能,來讓整體使用體驗變的更好,這篇文章來探討還可以修正的地方
我們可以將獲取語意的工作發布在其他線程上,這樣一來就不會阻塞到主線程上的工作,常見的切線程的方式有 Therad、Retrofit
基本上大概的架構都是像下面演示的一樣
new Thread(new Runnable() {
@Override
public void run() {
// 在這裡執行耗時操作
}
}).start();
其中 Runnable 也可以手動新增一個架構,將原本的 new Runnable(){}外包出去
接著碰到要更新主線程的東西的時候,我們可以選擇使用 runOnUiThread{} 來強制內部的程式執行在畫面上
我們可以利用 Retrofit 做到更精細的線程切換
大概用法如下
service.getUser(1)
.subscribeOn(Schedulers.io()) // 在 IO 線程上執行網絡請求
.observeOn(AndroidSchedulers.mainThread()) // 在主線程上觀察結果
.subscribe(user -> {
// 這裡的代碼在主線程上執行
}, throwable -> {
// 錯誤處理也在主線程上執行
});
透過上述切換線程的方式可以避免在要取語意分析結果時,因為網路請求而導致整個線程 Delay,進而讓畫面卡住的問題
現在回傳回來的格式基本上都是 Markdown 格式,因此我們可以選擇使用一個套件 Markwon,這個套件提供了將 TextView 元件變成可以支援 Markdown 格式的元件
Markwon 支援一般的 Markdown格式,需要顯示表格的話則要額外再添加table 的套件
// markwon
implementation 'io.noties.markwon:core:4.6.2'
implementation 'io.noties.markwon:html:4.6.2'
// markwon table plugin
// implementation 'io.noties.markwon:ext-tables:4.6.2'
接著主要的使用方式如下
Markwon markwon = Markwon.builder(context).build();
markwon.setMarkdown("TextView", "Markdown文本")
需要顯示 table 時,則在 build 前先將 table 加入
Markwon markwon = Markwon.builder(context)
.usePlugin(TablePlugin.create(context)).build;