fir*_*ice 7 java sockets multithreading android bluetooth
问题:
如何管理(连接,读取,写入,断开)通过配置更改而持续存在的蓝牙连接?
首选使用ActionBarSherlock与设备版本2.2"Froyo"兼容的解决方案.
问题...
既BluetoothDevice不能BluetoothSocket也不能保留onSaveState.
为了保持我的应用程序响应,12秒阻止调用BluetoothSocket.connect()必须在单独的线程上进行.启动a Runnable是线程长任务的推荐方法,但是尝试恢复配置更改是一场噩梦.官方文档指出了三种不同的解决方案.
使用getLastNonConfigurationInstance(),已被弃用(严重?!).
设置android:configChanges="keyboardHidden|orientation"类似于BluetoothChat示例.但是,这并未考虑所有类型的配置更改.
取消并重新启动任务,例如货架示例.在这种情况下,这可能会浪费另外12秒.
更新1
进一步的研究使我得到了asyncTaskLoader,但似乎这只能在完成时更新UI,并且无法提供更新.
BluetoothHDP示例使用服务.服务似乎侧重于进程间通信以及持续超出活动生命周期的需要.我不需要这些功能.
更新2
正如鲁本所指出的,Fragment.setRetainInstance(bool)已经取代了被弃用的getLastNonConfigurationInstance().在这一点上,似乎最好的选择是使用持久的非UI片段setRetainInstance(true).
对此有很多解决方案。如果您不使用 Fragments,那么最简单的选择是重写 onRetainNonConfigurationInstance()。不要介意该 API 已被弃用,那只是因为他们希望您使用 Fragment(公平地说,Fragment.setRetainInstance() 使整个问题变得理所当然)。这个 API 在很长一段时间内不会消失。
我要做的就是重写 onRetainNonConfiguration() 以返回“this”,即对死 Activity 实例的引用,然后从 onCreate() 复制所需的对象引用,即:
Object obj = getLastNonConfigurationInstance();
if (obj != null) {
MyActivity deadActivity = (MyActivity)obj;
this.foo = deadActivity.foo;
this.bar = deadActivity.bar;
...
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用服务,但我个人不喜欢它们。毫无疑问,对于执行跨进程的操作很有用,但除此之外,它们也是寻找问题的解决方案。
最后,作为一般顺序,您可以安全地将“全局”数据填充到您的应用程序上下文中。为此,您需要对 android.app.Application 进行子类化,并在清单中使用 <application android:name="MyApp"> 属性。在全局静态数据中保留对 Application 对象的引用也很有用,因此 AsyncTasks 和其他无上下文代码始终可以访问应用程序上下文,而不必无缘无故地传递 Context 参数。
class MyApp extends Application {
...
public static MyApp context;
...
@Override
public void onCreate() {
super.onCreate();
context = this;
... set up global data here ...
}
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6543 次 |
| 最近记录: |