2011-10-31 42 views
6

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

+0

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

+0

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ừ đó. –

+0

Tôi đã nêu ra [báo cáo lỗi] (http://code.google.com/p/android/issues/detail?id=34070). –

Trả lời

1

Đây thực sự là vấn đề về firmware cụ thể cho 3. * (có vẻ như).

Tôi đã thấy điều này xảy ra trên Asus Transformer TF101 và Sony Tablet S (cả hai với 3. *, đó là cách đây một thời gian).

Bắt đầu với 3.0, có API mới để kết nối với WiFi, không yêu cầu sử dụng enableNetwork theo lô (để bật tất cả mạng nhưng mạng hiện tại).

Thông tin thêm về những API, những gì tôi có thể thu thập từ mã nguồn 4.0:

  • Họ được đánh dấu bằng "@hide"
  • Chúng được sử dụng bởi các ứng dụng Settings
  • Họ vẫn chưa ghi nhận như là 4,1
  • Họ đã thay đổi phần nào giữa 3. * và 4. * runtime

tôi đề nghị là để thử và sử dụng những API thông qua phản ánh. Vì chúng được ứng dụng Cài đặt sử dụng, chúng hoạt động.

+0

Tôi không chắc liệu đó có phải là vấn đề phần mềm hay không từ những gì tôi biết trên HTC Jetsream, Samsung Galaxy Tab 10.1, Asus RF101, Sony Tablet S và Motorola Xoom. trong các vấn đề android db xung quanh đồng bộ hóa phương thức wifiManager.Âm thanh như Honeycomb không thể đồng bộ loại bỏ, thêm, kích hoạt và lưu từ nhiều luồng. Xem [issue] (http://code.google.com/p/android/issues/detail?id=34070) –

Các vấn đề liên quan