Tôi thấy chuỗi cuộc gọi của mình treo trong mã gốc khi gọi WifiManager.enableNetwork(). Cho đến nay, tôi chỉ có thể tái sản xuất này treo trên máy tính bảng Motorola Xoom chạy Android 3.2.1. Tôi đã thử nghiệm trên một số điện thoại và máy tính bảng khác (tất cả chạy Froyo hoặc Gingerbread) và chưa thấy sự cố. Xoom là thiết bị lõi kép duy nhất tôi phải kiểm tra (và tôi đã sao chép vấn đề trên 2 Xoom khác nhau), vì vậy tôi cảm thấy như tôi đang vấp phải một số yêu cầu luồng Android rất tinh tế khi giao tiếp với WifiManager. Stack trace nơi thread của tôi kêu gọi treo là:Chủ đề treo trên WifiManager.enableNetwork()
BinderProxy.transact(int, Parcel, Parcel, int) line: not available [native method]
IWifiManager$Stub$Proxy.enableNetwork(int, boolean) line: 513
WifiManager.enableNetwork(int, boolean) line: 587
ứng dụng của tôi là cố gắng kết nối với một điểm truy cập wifi được biết, thực hiện một số xét nghiệm, sau đó lại nối thiết bị với điểm truy cập ban đầu của nó (nếu nó trước đây đã kết nối). Trước khi thiết lập kết nối, chúng tôi đã xác minh rằng wifi đã được bật và chúng tôi đã thực hiện quét để xác minh rằng SSID điểm truy cập của chúng tôi được tìm thấy. Mã này để thiết lập kết nối đang chạy trong AsyncTask và trông giống như sau:
...
private WifiManager mWifiManager;
private List<WifiConfiguration> mConfiguredNets = new ArrayList<WifiConfiguration>();
private Object mConnectMonitor = new Object();
private NetworkInfo.State mNetworkState = State.UNKNOWN;
private final BroadcastReceiver mConnectionStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context inContext, final Intent inIntent) {
final String action = inIntent.getAction();
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
NetworkInfo ni =
(NetworkInfo)inIntent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
State state = ni.getState();
if (state == State.CONNECTED) {
synchronized (mConnectMonitor) {
mNetworkState = state;
mConnectMonitor.notify();
}
}
}
}
};
public void runninInAsyncTask(Context activityContext, int networkID) {
mWifiManager = (WifiManager)activityContext.getSystemService(Context.WIFI_SERVICE);
// Register our broadcast receiver to get network state change events
IntentFilter ifilter = new IntentFilter();
ifilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
activityContext.registerReceiver(mConnectionStateReceiver, ifilter);
// Get a list of our currently configured networks so we can re-enable
// them after connecting to the desired network
mConfiguredNets = mWifiManager.getConfiguredNetworks();
// Enable our network and disable all others
mWifiManager.enableNetwork(networkId, true);
// Start the reconnection process to connect to our desired network
synchronized (mConnectMonitor) {
mWifiManager.reconnect();
mConnectMonitor.wait(60000);
if (mNetworkState != State.CONNECTED) {
Log.e(TAG, "Problems connecting to desired network!");
}
else {
Log.e(TAG, "Successfully connected to desired network!");
}
}
// Re-enable all of our previously configured networks
for (WifiConfiguration wifiConfig : mConfiguredNets)
{
if (wifiConfig.status != Status.ENABLED) {
mWifiManager.enableNetwork(wifiConfig.networkId, false);
}
}
}
...
Mã này được dựa trên mã menu cài đặt Wifi trong mã nguồn mở Android Gingerbread. Có bất cứ điều gì về gọi WifiManager.enableNetwork() mà tôi đang thiếu? Nó có phải được chạy trên một chủ đề cụ thể không? Tôi đã thử đảm bảo rằng enableNetwork() được gọi trên luồng UI (bằng cách di chuyển logic tới bộ thu phát sóng). Điều này dường như giúp đỡ một chút, nhưng tôi vẫn có thể tái tạo hang. Có lẽ đây là một cái gì đó cụ thể để Honeycomb? Ngay bây giờ, 2 Xoom này là các thiết bị Honeycomb duy nhất tôi có sẵn để thử nghiệm, vì vậy chúng là những điểm dữ liệu duy nhất tôi có.
G
Có may mắn không? Có cùng một vấn đề. Chỉ cần tìm thấy một số thông tin mà có lẽ connectNetwork nên được sử dụng thay vào đó, nhưng không có AIDL chính thức cho điều đó được nêu ra, vì vậy bạn sẽ cần phải hack nó: ( – pprzemek
Vâng, tôi đã phải làm chính xác điều đó.Tôi đã sử dụng phản ánh để truy cập vào "ẩn "API (chỉ dành cho Honeycomb và sau này) và tôi chưa bao giờ gặp vấn đề gì kể từ đó. –
Tôi đã nêu ra [báo cáo lỗi] (http://code.google.com/p/android/issues/detail?id=34070). –