【发布时间】:2016-04-17 18:00:14
【问题描述】:
我正在尝试使用下面的类对HandlerThread 进行更新流,但我有几个关于变量捕获在 Java 中的工作原理的问题。
[1] ret 是否通过引用从封闭范围中捕获?
[2] this 是指Runnable,还是从封闭范围捕获的?
[奖励] StartStream 应该将Runnable 发布到处理程序线程,并且仅在Runnable 完成时返回。下面的代码会按预期工作吗?
public class Stream extends HandlerThread {
Handler handler = null;
Stream() {
super("Stream");
handler = new Handler(getLooper());
start();
}
private int _startStream() { // Start some repeating update
return 1;
}
public int StartStream() {
int ret = -1;
handler.post(new Runnable(){
@Override public void run() {
synchronized(this) {
ret = _startStream(); // [1]
this.notify(); // [2]
}
}
});
synchronized(this) {
while(ret == -1) {
try {
this.wait();
}
catch (InterruptedException e){}
}
}
return ret;
}
}
【问题讨论】:
-
你为什么要扩展
HandlerThread? -
因为
HandlerThread被设计为直接使用 -
写它的人
-
该课程没有被标记为最终课程,并且来源包含有关如果要扩展课程该怎么做的 cmets...所以您必须原谅我无视您的评论。跨度>
-
确保它不是最终的,有经验的用户可以扩展它并覆盖
onLooperPrepared,例如,确保它们也覆盖其他方法,但不是以你正在做的方式,请参阅:androidxref.com/6.0.1_r10/…,超过 9 / 10 的案例是直接使用HandlerThread
标签: java android multithreading