2014-04-20 41 views
0

我在我的應用程序中有2個按鈕。Wifi連接和套接字客戶端在一個按鈕中點擊probem

按鈕1:連接wifi的 按鈕2:創建一個客戶端套接字

與個人2個按鈕此功能工作。

void WifiConnect() { String networkSSID = "HI-LINK_DA79"; String networkPass = "12345678"; WifiConfiguration conf = new WifiConfiguration(); conf.SSID = "\"" + networkSSID + "\""; //ssid must be in quotes conf.preSharedKey = "\""+ networkPass +"\"";

WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE); 
    int r1 =-1; 
    r1= wifiManager.addNetwork(conf); 
    Log.d("Client", "add Network returned " + r1); 

    boolean b = wifiManager.enableNetwork(r1, true);   
    Log.d("Client", "enableNetwork returned " + b); 

    boolean d= wifiManager.reconnect(); 
    Log.d("Client", "wifiManager.reconnect() returned " + d) 


} 

`Button.OnClickListener buttonWifiConnectOnClickListener =新Button.OnClickListener(){

public void onClick(View v) { 

    WifiConnect(); 


    } 
}; 

Button.OnClickListener buttonConnectOnClickListener =新Button.OnClickListener(){

public void onClick(View v) { 

     if (socket == null) { 
      Log.i("Client", "socket():Creating --"); 
      new Thread(new ClientThread()).start(); 
      //connect.setText("Disconnect"); 
     } 
     else 
     { 
     try { 
      socket.close(); 
      socket=null; 
      Log.i("Client", "socket():closed --"); 
     // connect.setText("Connect"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     } 


    } 
}; 

`

但這,如果我在一個按鈕,結合他們點擊 `Button.OnClickListener buttonConnectOnClickListener =新Button.OnClickListener(){

public void onClick(View v) { 

     WifiConnect(); //WiFi connect 

     if (socket == null) { 
      Log.i("Client", "socket():Creating --"); 
      new Thread(new ClientThread()).start(); 
      //connect.setText("Disconnect"); 
     } 
     else 
     { 
     try { 
      socket.close(); 
      socket=null; 
      Log.i("Client", "socket():closed --"); 
     // connect.setText("Connect"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     } 


    } 
}; 

`

看起來像我的線程創建不工作套接字不在這裏調用,不知道爲什麼。

+1

在其他問題中,您將收到一個NetworkOnMainThread異常,用於在UI事件方法中執行套接字操作。 –

回答

0

如果您希望兩個操作都可以在一個按鈕上單擊,然後添加一個BroadcastReceiver來監聽Wifi連接狀態,如下所示。 &在onReceive()方法中做了套接字連接。由於WiFi連接需要時間&而沒有首先連接Wifi連接正在創建套接字連接,因此您的套接字連接無法工作,因此它可能會引發異常。

檢查Wi-Fi是否啓用,這並不一定意味着它連接。這僅表示手機上的Wi-Fi模式已啓用,並且能夠連接到Wi-Fi網絡。

這是如何監聽廣播接收機實際的Wi-Fi連接:

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) {  
     ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
      Log.d("WifiReceiver", "Have Wifi Connection"); 
        //If connected do socket connection here 
      } 
     else 
      Log.d("WifiReceiver", "Don't have Wifi Connection");  
    } 
}; 

爲了獲得你需要以下用途的許可添加到您的AndroidManifest.xml中激活的網絡信息:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

而下面的意圖接收器(或者你可以以編程方式添加此...)

<!-- Receive Wi-Fi connection state changes --> 
<receiver android:name=".WifiReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

&確保網絡活動在除主線程之外的其他線程上完成。您還需要註冊&正確註銷BroadcastReceiver。不要忘記在不需要時取消註冊。

+0

@ ashok449看到我編輯的答案 –

+0

穆罕默德謝赫,我曾用廣播接收器嘗試過(以編程方式添加),它運行良好。我從接收器打電話給我的插座。我應該用新解決方案更換解決方案嗎?看起來你只是加了一個延遲而依靠延遲可能不是一個好選擇吧? – ashok449

+0

我以爲你沒有找到適合的解決方案,所以我修改了答案。以上回答是適當的。只有當WiFi連接狀態發生變化時,纔會調用「onReceive」。所以我們必須小心。使用'Boolean'標誌來停止代碼再次執行。我回復了我的答案。 –

相關問題