Java 从接收方通知线程
这是我的主线:Java 从接收方通知线程,java,android,multithreading,broadcastreceiver,Java,Android,Multithreading,Broadcastreceiver,这是我的主线: Thread t = new Thread(){ @Override public void run() { // TODO Auto-generated method stub for(int i = 0; i < passes.length; i++){ progPass.setProgress(i); WifiConfiguration wc = new WifiConf
Thread t = new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < passes.length; i++){
progPass.setProgress(i);
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "\"" + dbw.getSsid() + "\"";
wc.preSharedKey = "\"" + passes[i] + "\"";
wc.status = WifiConfiguration.Status.ENABLED;
wc = configureCapabs(wc, dbw.getCapability());
int res = wifi.addNetwork(wc);
//Toast.makeText(this, "add Network returned " + res , Toast.LENGTH_SHORT).show();
boolean b = wifi.enableNetwork(res, true);
//Toast.makeText(this, "enableNetwork returned " + b , Toast.LENGTH_SHORT).show();
if(!b) continue;
try {
synchronized(this){
this.wait();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
boolean fin = wifi.getConnectionInfo() != null;
if(fin) break;
}
progPass.dismiss();
this.interrupt();
}
};
这里是注册舱单:
<receiver
android:name="ConnectivityActionReceiver"
android:enabled="true"
android:label="ConnectivityActionReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.STATE_CHANGE" />
<action android:name="android.net.wifi.supplicant.STATE_CHANGE" />
</intent-filter>
</receiver>
此时将显示onReceive方法中应显示的toast,这意味着已接收消息,但通知未到达线程,这意味着它处于等待状态。您正在使用两个不同的对象进行同步!一个是线程对象,一个是
ConnectivityActionReceiver
。当您使用此时
:
synchronized(this){
this.wait();
}
您锁定的是当前实例,因此您锁定的是案例中的不同实例
解决方案是对通用的全局可见对象调用wait/notify
:
final Object signal = new Object();
// in the waiting thread
synchronized(signal) {
signal.wait();
}
// in the signaling thread
synchronized(signal) {
signal.notifyAll();
}
您正在使用两个不同的对象进行同步!一个是线程对象,一个是
ConnectivityActionReceiver
。当您使用此时
:
synchronized(this){
this.wait();
}
您锁定的是当前实例,因此您锁定的是案例中的不同实例
解决方案是对通用的全局可见对象调用wait/notify
:
final Object signal = new Object();
// in the waiting thread
synchronized(signal) {
signal.wait();
}
// in the signaling thread
synchronized(signal) {
signal.notifyAll();
}