如何扩展现有的后台线程解决方案?

时间:2011-06-03 23:37:53

标签: android multithreading thread-safety

我正在使用Eclipse开发一个绘制蓝牙数据的Android应用程序。

我正在使用开源代码,它有一个现有的解决方案,我想扩展而不是替换来解决我上面讨论的开发问题。

开源代码有一个非常漂亮且可靠的后台线程,除其他外,即使我切换到新活动,也会不断将BluetoothData记录到logcat。

目前我有一个我关注的解决方案:我只是利用写入logcat的后台线程方法来调用我的Plotting Activity中的静态plotData()方法。结果似乎很好。我得到了一个很好的情节。它实时剪辑。看起来像示波器。

但是我收到了关于使用现有后台线程和静态方法绘制蓝牙日期的负面反馈。有人建议我使用新线程,或添加处理程序,或使用Async Task或AIDL来解决我的问题。

我看过所有这些解决方案都没有成功。似乎没有什么像我的静态plotData()方法那样工作。也就是说现有的后台线程调用我的静态plotData()方法,这会产生一个看起来很棒的实时图。

但我仍然担心负面反馈。我只想扩展我现有的后台线程解决方案,我已经通过调用静态方法来绘制数据。

这种方法可能会遇到什么问题?线程安全?僵局?我不知道。

为什么人们在扩展我现有的线程以调用静态方法时,仍然建议我创建一个新的线程,处理程序,异步任务或服务来解决我的问题似乎工作正常?

有什么建议吗?扩展现有线程以使用静态方法实时绘制数据会有什么问题?

1 个答案:

答案 0 :(得分:3)

任何人说你应该使用AIDL是一个不应该被听取的懒人。 :)如果您不希望在用户未查看您的活动时运行后台线程,则有人说您需要服务。

我不确定你的意思是“写入logcat来调用静态plotData()。”您应该只写入logcat进行测试。写入logcat不会导致调用任何Java方法。

如果要在Activity上调用静态plotData()方法,则需要非常小心:首先因为很难弄清楚应该从那里调用哪个活动实例(它可以随时从用户完成它消失,或者在配置改变时重新创建为新实例等;);第二,因为您无法从后台线程触摸应用程序的UI /视图层次结构而不会冒您损坏其状态的风险(因为视图层次结构是单线程的)。

对于这种事情,通用模型是让后台线程做一些工作,生成下一个要显示的数据。完成工作后,您会向主线程发送一条消息,让它显示新数据。 AsyncTask可以是一种简单的方法,它可以处理底层的消息发送和线程。你也可以自己实现这个,在某个时候有一个Handler,你发布Runnable或发送一个消息,一旦在UI线程上执行,就会更新你的视图状态。

(当然如果你使用的是SurfaceView,那么整个问题就是允许在主UI循环之外绘制它,所以你的后台线程可以直接根据需要绘制它。基本上就像写作一样一场比赛。)