天天看點

Weex總結之Android Weex工程搭建趟坑

目前蝦米也打算接入weex,内網上看似很多的基礎教程,但根據講解一步步做下來卻一直無法實作效果。仔細看資料,才了解究竟是為什麼,把自己的心得記錄下來友善後來者。

今天要完成的效果就是使用android工程來渲染下面的效果:

Weex總結之Android Weex工程搭建趟坑

首先解釋幾個概念,友善大家有個整體了解

在有些文章中會提到 weex dsl或者dsl,那麼這個dsl究竟是個什麼鬼呢?

dsl的全稱是領域特定語言,是針對特定問題領域的程式設計語言,而非通用語言。是以weex dsl也就是指針對weex 所縮寫的一套語言。

而利用weex dsl語言所寫的程式,儲存時的格式就是我們常見的.we字尾格式。

在android代碼中,無法直接加載.we檔案的,但是可以加載.js檔案的,是以我們需要把.we檔案轉換成.js檔案,weex給我們提供了一個工具weex-toolkit

首先,我們需要利用nmp在指令行安裝它:

在安裝完以後,在指令行,隻輸入weex,如果出現下面help界面,就說明安裝成功了

Weex總結之Android Weex工程搭建趟坑

下面就是使用weex-toolkit轉換we檔案了

(tech_list.we檔案在底部源碼工程根目錄下)

上面總共兩句話,首先,将目前工作路徑切換到we檔案所在的目錄,如果不切,則需要指定we檔案所在的絕對路徑。

然後直接使用weex指令轉換即可

在輸入指令以後,首先會直接打開一個網頁顯示這個we檔案的渲染效果:

Weex總結之Android Weex工程搭建趟坑

然後在tech_list.we檔案所在的檔案夾下,會産生一個檔案夾weex_temp,這個檔案夾是就浏覽器中所顯示的内容的源檔案,其中有一個跟tech_list.we所對應的tech_list.js檔案,它就是轉換後的js檔案,我們在android工程中所使用的就是它!

Weex總結之Android Weex工程搭建趟坑

在拿到tech_list.js以後,我們就開始搭android工程了;

這篇文章不基于源碼建構,本篇文章的宗旨是教大家先跑起來……在跑起來以後再引入源碼建構就好辦了。

(1)、建立gradle項目,minimum sdk不得低于14;(低于14,weex不支援)

Weex總結之Android Weex工程搭建趟坑

(2)、配置gradle

在工程根目錄下build.gradle檔案中,加入阿裡倉庫,以便引入遠端weex包:

檔案位置如圖:

Weex總結之Android Weex工程搭建趟坑

(3)、添加依賴

在app項目中的build.gradle檔案中,添加項目依賴:

其中除了最後一個picasso依賴是我自己加進去的以外,另外四個都是必須添加的。因為weex_sdk底層是依賴他們的,隻是以provided形式引入其中的,是以我們上層必須complie上。

檔案位置如下:

Weex總結之Android Weex工程搭建趟坑

在添加依賴以後,我們就開始正式寫代碼了,首先是需要将weex在應用程式oncreate時候初始化:

weex的初始化主要是靠<code>wxsdkengine.initialize(this,config)</code>函數,該函數聲明如下:

關鍵在于第二個參數initconfig config,它是由initconfig.builder()構造得來的,initconfig.builder()中可以讓我們通過setimgadapter來設定自定義的圖檔加載器,通過sethttpadapter來自定義網絡請求方式。但我們有一點必須強調的是:weex的優勢在于渲染,是以除了渲染以外的事情,都需要我們自己來做。也就是說加載圖檔和網絡請求都需要我們自己來寫方法實作;如果我們沒有實作,那麼當有圖檔加載請求和網絡請求時,就不會執行任何實際代碼,也就不會有任何效果!這也就是在初始化的時候,需要通過builder.setimgadapter和builder.sethttpadapter來設定自定義擴充卡的原因!慶幸的是,weex為我們實作了預設的網絡請求擴充卡defaultwxhttpadapter,當發現我們在網絡請求時,并沒有定義網絡擴充卡就會使用預設的defaultwxhttpadapter來請求網絡。但可惜的是,weex并沒有為我們實作預設的圖檔擴充卡,是以我們在初始化的時候必須實作自己的圖檔加載擴充卡,并通過 builder.setimgadapter設定進去。如果我們沒有寫,那當需要加載圖檔的時候,就相當于執行了空方法,原來需要顯示圖檔的地方就不會有任何顯示!

然後我們來看看我們自定義的imageadapter是如何實作的:

在寫擴充卡時,我們必須實作iwximgloaderadapter接口,當需要加載圖檔時,就會通過iwximgloaderadapter的setimage方法傳過來,在setimage的參數中,第一個參數final string url表示網絡圖檔位址,第二個參數,表示目前需要顯示圖檔的view

我們這裡隻需要從網上加載圖檔,并将結果設定給view就可以了。哪種方法随意……我這裡使用的picasso,這也是為什麼在依賴中添加picasso依賴的原因

我們在自定義了application以後,一樣要記得在androidmanifest.xml中引入:

注意添加網絡權限和引入weexapplication

首先将我們在文章開頭的tech_list.js檔案添加到工程中,在java檔案夾的同級目錄中,添加一個assets檔案夾,将tech_list.js檔案添加到其中

Weex總結之Android Weex工程搭建趟坑

首先,需要說明一點,weex隻負責渲染,渲染出來以後會傳回一個結果view給我們,我們把它放到哪裡就是我們自己來決定了,是以,首先,我們需要提供一個container來盛裝傳回的view,是以myactivity的布局如下:(main.xml)

這裡的framelayout,就是用來盛裝結果用的container;

然後myactivity中的代碼如下:

最關鍵是下面的三行代碼:

首先,我們使用mweexinstance.render()函數就可以渲染本地的js檔案了,在渲染成功以後,我們需要監聽渲染結果,并将它添加到我們的container中,是以我們利用mweexinstance.registerrenderlistener()來監聽渲染狀态。當完成以後,會在onviewcreated中将渲染成功的view對象傳回,我們隻需要将它加載到container中顯示出來即可。

如果我們需要加載遠端js檔案,可以使用:

ok啦,到這裡本篇就結束了,運作出來的效果就如開篇所示;