2013-06-28 69 views
0

我有一种方法返回一个BufferedReader,我的应用程序从中获取另一个程序的输出。将BufferedReader传递给服务

在Manager.java

public BufferedReader start() { 
    String[] commandLine2 = { "/system/bin/sh", "/system/app/launcher.sh" }; 

    Process process = null; 

    try { 
     process = Runtime.getRuntime().exec(commandLine2); 
     reader = new BufferedReader(new InputStreamReader(
       process.getInputStream())); 
     writer = new OutputStreamWriter(process.getOutputStream()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return reader; 
} 

在我的MainActivity我使用: outputReader = manager.start();其中outputReader是BufferedReader和经理的私有实例是经理之一。

只要我在MainActivity.java里面的东西一个的AsyncTask使用缓冲读卡器进入ok了,因为我BufferedReader是在其范围内可见,当我想用​​一个服务来完成我有一些麻烦的任务。

没有办法将Intent.putExtra(Object)用于既不可序列化也不可Parcelable的对象(并且我的BufferedReader不是)。

如何将我的BufferedReader传递给服务?

+0

你就不能暴露你的服务的公共方法,并把它传递给?例如'setReader()'。看到这里:http://stackoverflow.com/questions/2272378/android-using-method-from-a-service-in-an-activity –

+0

在我的MainActivity我使用此代码来启动服务:'Intent service = new意图(getApplicationContext(),ReaderService.class); startService(service);'在这种情况下,我怎么能使用'setReader()'方法?当然,有这样的方法是有用的和足够的 – Rob013

+1

如果不知道你的架构或服务,我会说一个绑定的服务会更好 - 那么你基本上可以在你的活动中引用你的服务,你可以调用公共方法*。看看这里的IBinder示例:http://stackoverflow.com/a/10799514/833647 –

回答

1

我会建议你使用Bound Service

http://developer.android.com/guide/components/bound-services.html

一个绑定的服务是在客户机 - 服务器接口的服务器。一个绑定的服务允许组件(如活动)绑定到服务,发送请求,接收响应,甚至进行进程间通信(IPC)

基本上你可以暴露你的服务的公共方法和调用它们。因此,在这种情况下,您可以在您的服务中创建如下内容:

public void setReader(BufferedReader reader) { 
    this.reader = reader; 
    // do whatever you want with it in your service, etc. 
} 

并从您的活动中调用它。

欲了解更多详情,请参阅本伟大的职位:Android - Using method from a Service in an Activity?

1

我只通过Intent.putExtra传递原始数据,只有它们是几个。 当我需要更多的基元时,我声明了一个DataTransferObjectOfMyType,它们保持在一起。 这就是我设置为常见的地方,如MyApplication类中的ApplicationContext。 关于新的意图,我检查是否存在,并使用它。好或坏的设计我不在乎。这是工作。如果你对所有事情都很重要,比使用这种方法,因为它正在工作:)

btw:我不会通过Buffered阅读器,因为谁知道什么时候需要关闭。 而不是我会传递所有参数,这需要创建一个BufferedReader。

我希望它有帮助!

+0

感谢您的答案数学,我会尝试你的方法(你怎么能保存DTO在你的应用程序上下文?使用Bundle或SharedPreferences也许?)但Bound Services只是根据你的建议,根据你的建议,我学到了一些新东西,不管它是怎样工作的:D – Rob013

+0

@ Rob013 DTO在Activity之间传递了一个setter和getter,就像属性一样。如果需要我做出persinstent,那么需要编写他的序列化和反序列化过程。这样做的一个优点是:我知道那里有什么,我有完全访问权限而不是Buffered Reader os其他复杂的系统对象,可能有一些不可序列化的字段。有几次遇到这些情况,需要大量覆盖和解决方法。这是简单的工作解决方案:)易于测试,修改等。为什么要重新发明轮子? :) – 2013-06-28 14:42:28