需要从Android捕获选择性STDOUT以在listview中显示

需要从Android捕获选择性STDOUT以在listview中显示,第1张

概述我在 Android中运行了一个嵌入式库[tuProlog(2p.jar)] Prolog推理引擎,带有自定义逻辑库,我可以在Android ListView中成功查询和显示(部分)结果. 显示的内容只是来自推理引擎本身的结果,而不是像Prolog’write’语句这样的辅助命令(默认情况下)写入STDOUT. 我需要在Android变量中将“写入”打印的结果捕获到STDOUT以显示给用户.一般的 我在 Android中运行了一个嵌入式库[tuProlog(2p.jar)] Prolog推理引擎,带有自定义逻辑库,我可以在AndroID ListVIEw中成功查询和显示(部分)结果.

@H_404_8@

显示的内容只是来自推理引擎本身的结果,而不是像Prolog’write’语句这样的辅助命令(默认情况下)写入STDOUT.@H_404_8@

我需要在AndroID变量中将“写入”打印的结果捕获到STDOUT以显示给用户.一般的想法(我没有与ListVIEw结合实现)是模拟命令行交互,如果他们运行Java Based Prolog Interpreter终端接口,它将参与其中.@H_404_8@

我想坚持知识工程的领域,而不是进入系统工程,以完成这个项目,所以我很感激任何有关这个问题的见解.@H_404_8@

我的研究引导我here作为进一步研究的途径,但系统的东西很快就超越了我的经验.@H_404_8@

非常感谢提前….@H_404_8@解决方法 经过我自己的研究以及tuProlog开发人员的进一步讨论之后,我有一个解决这个问题的方法,我觉得值得与这个社区分享…

@H_404_8@

该问题的整体背景是让任何Prolog实现在“正确”的AndroID上作为更有趣的应用程序(专家系统,游戏AI和自然语言接口)的基础架构在以后的工作.@H_404_8@

最大的障碍是Prolog是一个基于“控制台”的解释环境,可以打印到STDOUT,而AndroID可以容忍控制台打印活动,默认情况下它会将所有这些 *** 作路由到/ dev / null.@H_404_8@

因此,有两组问题需要解决:(1)是否有任何Prolog可移植到AndroID环境,以及(2)当它被路由到/ dev / null时,如何“正确”处理捕获控制台输出的问题.@H_404_8@

解决(1):我们选择了tuProlog Site,其官方来源可以找到:Google Code Repository – tuProlog.他们设计的prolog被一个JAR文件嵌入,特别是AndroID.他们是我们发现的唯一一个做到这一点的人,他们对开发人员“敏感”.他们的东西是开源Java / AndroID,他们有一个AndroID Prolog应用程序,即将推出更新.询问他们的代码对于找到合适的解决方案是非常宝贵的.@H_404_8@

解决(2):为本研究增加最多价值的链接是:Reading from PrintStream,Convert Java OutputStream to InputStream,最终是最有用的StreamWriter to OutputStream.@H_404_8@

具体来说,需要做的是:@H_404_8@

>创建ByteArrayOutputStream对象以捕获二进制数据
从打印过程到控制台(Sy@R_403_6563@.out).
>在中创建PrintStream对象(使用ByteArrayOutputStream)
设置Sy@R_403_6563@.setout(它控制控制台输出[Sy@R_403_6563@.out.println]去往的位置)
>重新调整系统输出
>将所需的控制台打印输出捕获到字符串变量
>将该字符串(在此AndroID项目的情况下)添加到ListvIEw的一行
>通知ListvIEw数据已更改
>重置ByteArrayOutputStream对象(以避免连接)@H_404_8@

这是代码:@H_404_8@

@H_404_8@

// OutPutStream I/O Experimental Stuff   PrintStream orgStream   = Sy@R_403_6563@.out;   // ByteArray Sub Experimental Stuff   ByteArrayOutputStream baos = new ByteArrayOutputStream();   PrintStream psout = new PrintStream(baos,Boolean.TRUE); // Using autoFlush   // Instantiate an instance of the Prolog Engine.    //Do this only once because it's VERY expensive.   Prolog engine;    // ReRouting Print Streams     // (InsIDe method we need to capture console output)    Sy@R_403_6563@.setout(orgStream);           // Set the Sy@R_403_6563@ Output Stream      String myResult = baos.toString();      // returns the actual text     myChatListItems.add(myResult);          // Add Text to New ListVIEw Row      chatbotAdapter.notifyDataSetChanged();  // notify the Adapter to Refresh    baos.reset();                           // reset the ByteArrayOutputStream      Sy@R_403_6563@.setout(orgStream);  // reset the Sy@R_403_6563@ Output Stream

最后的笔记:
tuProlog考虑了控制台打印问题,并围绕它设计了这个特定的实现,使用Listeners和Events的组合来正确地解决Prolog“Write”命令以及其他命令的捕获问题.@H_404_8@

通过仔细阅读用户指南中建立的首选方法,可以非常轻松地完成Strict Prolog查询的解决…开发人员可以快速了解他们需要的内容.@H_404_8@

这是捕获Prolog引擎的功能,比如写,间谍和错误事件更难确定(我最终咨询了开发人员).为此,您需要询问他们的CUIConsole的AndroID实现(而不是他们的CUIConsole的控制台实现,这是’不同’).@H_404_8@

简而言之,答案是这样的:(a)建立一个听众,然后(b)为将要举办的活动做好准备.@H_404_8@

这是代码:@H_404_8@

@H_404_8@

// Establish Prolog engine and it's appropriate Listeners    // [Warning,Output,and Spy]     engine = new Prolog();    engine.adDWarningListener(this);    engine.addOutputListener(this);    engine.addSpyListener(this); //// PRolOG CONSolE OUTPUT MECHANISMS *******************************@OverrIDepublic voID onSpy(SpyEvent e) {    Log.d(TAG,"** LG'd onSpy => SpyEvent Occured ** " );    Sy@R_403_6563@.out.println("** onSpy => SpyEvent Occured ** \n ");    myChatListItems.add( e.getMsg() );    chatbotAdapter.notifyDataSetChanged();}@OverrIDepublic voID onOutput(OutputEvent e) {    Log.d(TAG,"** LG'd: onOutput => OutputEvent Occured ** " );    Sy@R_403_6563@.out.println("** onOutput => OutputEvent Occured ** \n ");    myChatListItems.add( e.getMsg() );    chatbotAdapter.notifyDataSetChanged();}@OverrIDepublic voID onWarning(WarningEvent e) {    Log.d(TAG,"** LG'd: onWarning => WarningEvent Occured ** " );    Sy@R_403_6563@.out.println("** onWarning => WarningEvent Occured ** \n ");    myChatListItems.add( e.getMsg() );    chatbotAdapter.notifyDataSetChanged();}

结束注意:对于那些对“Prolog on AndroID”感兴趣的人,我非常乐意提供我编写的任何代码或我拥有的资源,以帮助您完成此过程.请不要犹豫.@H_404_8@ 总结

以上是内存溢出为你收集整理的需要从Android捕获选择性STDOUT以在listview中显示全部内容,希望文章能够帮你解决需要从Android捕获选择性STDOUT以在listview中显示所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1128497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存