首頁>技術>

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可解決耗時任務,不造成介面卡頓。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 記錄遇到的問題