2 部分交付混合了 JSON 的 Android 应用程序(二)文库.ppt_第1页
2 部分交付混合了 JSON 的 Android 应用程序(二)文库.ppt_第2页
2 部分交付混合了 JSON 的 Android 应用程序(二)文库.ppt_第3页
2 部分交付混合了 JSON 的 Android 应用程序(二)文库.ppt_第4页
2 部分交付混合了 JSON 的 Android 应用程序(二)文库.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在Android上使用XML和JSON,第2部分交付混合了JSON的Android应用程序(二),连接JavaScript接口清单5.CalculatorHandler实现清单6.WebView控件中呈现(和执行)的index.html插入JavaScript代码清单7.从Java调用PerformSimpleCalculation()JavaScript函数清单8.通过传递一个JSON对象调用更复杂的函数交换JSON对象结束语,连接JavaScript接口,下一步是启用Activity中的Java代码,以与WebView管理的HTML文件中的JavaScript代码交互。这是通过调用addJavascriptInterface()方法完成的,如清单4所示。该函数的参数是一个Java类的实例和一个名称空间标识符。例如,对于这个应用程序,您定义一个calc名称空间,并实现名为CalculatorHandler的类中的代码,如清单5所示。,清单5.CalculatorHandler实现,/JavascripthandlerfinalclassCalculatorHandlerprivateintiterations=0;/writetoLogCat(Info)publicvoidInfo(Stringstr)iterations+;Log.i(Calc,str);/writetoLogCat(Error)publicvoidError(Stringstr)iterations+;Log.e(Calc,str);/sampletoretrieveacustom-writtenfunctionwiththedetailsprovided/bytheAndroidnativeapplicationcodepublicStringGetSomeFunction()iterations+;returnvarq=6;functiondynamicFunc(v)returnv+q;/KilltheapppublicvoidEndApp()iterations+;finish();,publicvoidsetAnswer(Stringa)iterations+;Log.i(tag,Answer+a+);publicintgetIterations()returniterations;publicvoidSendHistory(Strings)Log.i(Calc,SendHistory+s);tryJSONArrayja=newJSONArray(s);for(inti=0;ija.length();i+)Log.i(Calc,Historyentry#+(i+1)+is+ja.getString(i)+);catch(Exceptionee)Log.e(Calc,ee.getMessage();,在JavaScript环境中,通过window.calc.methodname语法访问CalculatorHandler的方法。例如,CalculatorHandler实现一个名为Info()的方法,后者接受一个字符串参数并将之写到应用程序日志中。要从JavaScript环境访问此方法,可使用类似这样的语法:window.calc.Info(writethisstringtotheapplicationlog!);。基本了解了如何从JavaScript代码调用Java代码之后,我们再来看清单6中的index.html文件,看各种方法是如何被调用的。,清单6.WebView控件中呈现(和执行)的index.html,AndroidtoJavaScriptwithJSONvarcmdHistory=newArray();,functionstartup()trywindow.calc.Info(Startingup.);cmdHistorycmdHistory.length=startup;catch(ee),functionPerformSimpleCalculation(formula)trycmdHistorycmdHistory.length=PerformSimpleCalculation;varanswer=eval(String(formula);document.getElementById(data).value=answer;window.calc.setAnswer(answer);catch(ee)window.calc.Error(ee);,functionPerformComplexCalculation(andmethod)try/*argumenttothisfunctionisasingleobjectwith2membersorproperties*operation:thisisastringnamingwhatwewantthefunctiontodo.*arrayofarguments:thisisanarrayofintegers*/alert(andmethod.operation);/alert(andmethod.arguments.length);,if(andmethod.operation=addarray)cmdHistorycmdHistory.length=PerformCompleCalculation-addarray;vari;varresult=0;for(i=0;iandmethod.arguments.length;i+)result+=andmethod.argumentsi;document.getElementById(data).value=result;window.calc.setAnswer(result);,if(andmethod.operation=multarray)cmdHistorycmdHistory.length=PerformCompleCalculation-multarray;vari;varresult=1;for(i=0;iKillThisApp,仔细研究一下清单6末尾的按钮处理程序。基本上,这些按钮处理程序都调用window.calc名称空间中的方法,这些方法在AndroidJSON.java中的CalculatorHandler类中实现。清单5和清单6协同工作,演示了JavaScript环境中初始化的和Java源文件中实现的代码交互。但是如何从Activity代码中初始化一些您想要在WebView中发生的动作呢?现在应该更深入地来看Java代码了。,插入JavaScript代码,从将一个数学公式传递到JavaScript代码进行计算这样一个任务开始。JavaScript最伟大(也最危险)的特性之一是eval()函数。eval()函数允许字符串代码的运行时计算。在本例中,您从EditText控件接受一个字符串并传递到JavaScript环境进行计算。具体来说,我们调用清单6中的PerformSimpleCalculation()函数。清单7包含AndroidJSON.java中的代码,它负责处理按钮选择。,清单7.从Java调用PerformSimpleCalculation()JavaScript函数,btnSimple.setOnClickListener(newOnClickListener()publicvoidonClick(Viewv)Log.i(tag,onClickSimple);/PerformactiononclicktryStringformulaText=formula.getText().toString();Log.i(tag,Formulais+formulaText+);browser.loadUrl(javascript:PerformSimpleCalculation(+formulaText+););catch(Exceptione)Log.e(tag,Error.+e.getMessage(););,不管此方法有多少行,这里唯一要关注的是browser.loadurl()行,它传递一个格式字符串:javascript:。此JavaScript代码被注入到WebView的当前页面并执行。这样,Java代码就可以执行WebView中定义的JavaScript代码了。在Simple例子中,传递了一个字符串。但是,当需要处理更复杂的结构时该怎么办呢?这就是JSON可派上用场的地方。清单8展示了PerformComplexCalculation()函数的调用,该函数参见清单6。,清单8.通过传递一个JSON对象调用更复杂的函数,btnComplex.setOnClickListener(newOnClickListener()publicvoidonClick(Viewv)Log.i(tag,onClickComplex);/PerformactiononclicktryStringjsonText=;if(flipflop=0)jsonText=operation:addarray,arguments:1,2,3,4,5,6,7,8,9,10;flipflop=1;elsejsonText=operation:multarray,arguments:1,2,3,4,5,6,7,8,9,10;flipflop=0;Log.i(tag,jsonTextis+jsonText+);browser.loadUrl(javascript:PerformComplexCalculation(+jsonText+););,catch(Exceptione)Log.e(tag,Error.+e.getMessage(););,研究一下清单6中的JavaScript函数PerformComplexCalculation。注意,传递进来的参数不是字符串,而是您自己创建的一个对象。operation-要处理的函数或过程的名称arguments-这是一个整数数组,对象只包含两个属性,但是完全可以更复杂,以满足更高的需求。在本例中,PerformComplexCalculation()JavaScript函数支持两种不同的操作:addarray和multarray。当这些操作在调用时完成其工作时,通过调用函数window.calc.setAnswer,将结果传递回Java代码。这里,您看到了Java和JavaScript代码之间的双向数据流。在本例中,您传递了一个JSON对象,但是得到的一条经验是,在处理从Java代码返回来的Java字符串时,它有助于将它们转换成JavaScript字符串。这可以像本例中一样通过将值传递给String函数来做到:eval(String(formula);。,JavaScripteval()函数使用JavaScript字符串。无需转换的话,eval函数基本上不做任何事情。对于一个稍微复杂一点的例子,鼓励您好好看一下Dynamic按钮在WebView中被选中时的代码段。要完成代码例子,来看一下将一个字符串数组从JavaScript环境传递到Java环境。,交换JSON对象,示例应用程序(index.html)中的JavaScript代码将本地函数调用记录到一个名为cmdHistory的页面级别数组中。每次调用函数时,您都将一个新条目添加到该数组中。例如,当dynamicfunction()被调用时,一个新的字符串被存储:cmdHistorycmdHistory.length=PerformCompleCalculation-dynamic;。关于此方法,没有什么特别的地方;它只是一个在页面级别收集使用数据的例子。也许该数据存储在Android应用程序的数据库中会有用。此数据如何回到Java代码呢?,要发送字符串对象数组,您调用JSON.stringify函数,将数组作为参数传递进来。根据需要,stringify函数可以允许定制一个复杂对象的特定属性如何被格式化。关于这是如何完成的更多信息,可以参考中的解释(参见参考资料)。图3展示了应用程序的典型运行中解析JSON数组之后Log中的内容。,图3.解析从JavaScript发送来的JSON数组,本例只存储字符串数据,所以您可以简单地将之附加到一个较长的字符串后面,并调用CalculatorHandler中的一个简单函数,然后该函数可以将之解析出来。但是,若是应用程序想要跟踪其他数据(比如某些变量的值)或者甚至试图通过记录特定的函数调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论