項目發布以后由於外部數據的問題總是有部分邏輯代碼要更改,而每次更改都必須從新發布,審核,下載,更新很是麻煩,客戶流失嚴重。想過很多解決 方案,如:加個客戶更新每次提示更新或者弄台服務器將外部數據統一等等,當然都不靠譜。前幾日想到可以通過腳本來解決,由於腳本是個解釋型語言不需要使得 程序重新編譯發布等過程,維護起來相當方便。雖說執行效率會慢一點,但是那么點語句一點都影響。
正題,由於我只對lua比較熟悉所有首選lua。了解了一下android上調用lua的方法。
參考:
http://blog.csdn.net/hpccn/article/details/8003454 我也沒有編譯,直接將他庫托進我的項目
考慮到維護方便,我將lua代碼文件放在了服務器上,通過(HttpURLConnection)加載lua文件
干貨:
1 //根據URL得到輸入流 2 public InputStream getInputStreamFromUrl(String urlStr) 3 throws MalformedURLException, IOException { 4 URL url = new URL(urlStr); 5 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 6 InputStream inputStream = urlConn.getInputStream(); 7 return inputStream; 8 }
1 // 將獲得到的流保存到一個字符串里 2 private String loadAssetsString(String resPath) { 3 InputStream isread = null; 4 byte[] luaByte = new byte[1]; 5 try { 6 isread = getInputStreamFromUrl(resPath); 7 int len = isread.available(); 8 luaByte = new byte[len]; 9 isread.read(luaByte); 10 } catch (IOException e1) { 11 12 } finally { 13 if (isread != null) { 14 try { 15 isread.close(); 16 } catch (IOException e) { 17 } 18 } 19 } 20 return EncodingUtils.getString(luaByte, "UTF-8"); 21 }
1 //調用lua 2 3 LuaState L = LuaStateFactory.newLuaState(); 4 L.openLibs(); 5 String temp = loadAssetsString("http://192.168.1.21:6014/appupdate/testLua.lua"); 6 L.LdoString(temp); 7 8 L.getGlobal("text"); 9 String text = L.toString(-1); 10 11 // L.close(); 12 13 mTextView.setText(text); 14 15 16 //調用lua中的函數 17 L.getField(LuaState.LUA_GLOBALSINDEX, "cutStr"); 18 L.pushString("in the pad!"); //傳入參數 19 L.call(1,1); //調用函數指定參數和返回值個數 20 21 L.setField(LuaState.LUA_GLOBALSINDEX, "a"); //將返回值保存到參數a中 22 LuaObject obj = L.getLuaObject("a"); //獲取參數a 23 24 mTextView.setText(obj.toString());
lua代碼:
1 text = "" 2 for i = 0,10 do 3 for k = 0,10-i do 4 text = "中" .. text 5 end 6 text = "\n"..text 7 end 8 9 10 function cutStr (str) 11 12 j = string.find(str,"pad") 13 k = string.find(str,"in") 14 restr = string.sub(str,k,j) 15 16 return restr 17 end
收....