flutter是單執行緒模型,即使有非同步佇列操作,但是一本小說最少也有幾百章節,所以大量任務堆積會造成介面卡頓。在此需求中單執行緒已經無法滿足程式需求,由此引出dart的多執行緒isolate。
但是由於dart中的Isolate比較重量級,UI執行緒和Isolate中的資料的傳輸比較複雜,因此flutter為了簡化使用者程式碼,在foundation庫中封裝了一個輕量級compute操作.
要使用compute,必須注意的有兩點,一是我們的compute中執行的函式,必須是頂級函式或者是static函式,二是compute傳參,只能傳遞一個引數,返回值也只有一個。
首先宣告一個static 返回值為Future的下載函式,返回章節內容
static Future<String> requestDataWithCompute(String id) async { try { var url = Common.bookContentUrl + '/$id'; var client = new HttpClient(); var request = await client.getUrl(Uri.parse(url)); var response = await request.close(); var responseBody = await response.transform(utf8.decoder).join(); var dataList = jsonDecode(responseBody);\t return dataList['data']['content'].toString().trim(); } catch (e) { print(e); } }
再返回內容快取到本地
for (var chapter in bookTag.chapters) { String id = chapter.id; if (!SpUtil.haveKey(id)) { String content = await compute(requestDataWithCompute, id); SpUtil.putString(chapter.id, content); chapter.hasContent = 2; } print("download ${chapter.name} ok"); } Toast.show("${bookInfo?.Name ?? ""}下載完成");
由此利用flutter包裝的輕量級compute可解決耗時任務,不造成介面卡頓。
最新評論