-2

以下のコードを使用してwifiに接続しています。アプリが読み込まれると、黒い画面が表示されるだけで、Wi-Fi から切断するためのボタンが表示されます。ボタンがすぐに表示されるようにする方法はありますか? また、ユーザーがハングアップしたと思わないように、アプリケーションのロードの進行状況を表示する方法はありますか?

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

import android.widget.Button;
import android.widget.TextView;

public class TestActivity extends Activity {
/** Called when the activity is first created. 
 * @return */



@Override
public void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    Button OffWifi = (Button)findViewById(R.id.offwifi);
    OffWifi.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) {                 
          WifiManager wifiManager = (WifiManager)getBaseContext().getSystemService(Context.WIFI_SERVICE);
            wifiManager.setWifiEnabled(false);          
          }        
      });



    TextView tv = new TextView(this);       
    TextView status = new TextView(this);                  


    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    WifiConfiguration wc = new WifiConfiguration();  
    wc.SSID = "\"Test\""; //IMP! This should be in Quotes!! 

    wc.hiddenSSID = true; 
    wc.status = WifiConfiguration.Status.ENABLED;      
    wc.priority = 10; 
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);  
    wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
    wc.preSharedKey = "\"Password\""; 
    WifiManager  wifiManag = (WifiManager) this.getSystemService(WIFI_SERVICE); 
    boolean res1 = wifiManag.setWifiEnabled(true); 
    int res = wifi.addNetwork(checkPreviousConfiguration(wc)); 
    Log.d("WifiPreference", "add Network returned " + res ); 
    boolean es = wifi.saveConfiguration(); 
    Log.d("WifiPreference", "saveConfiguration returned " + es ); 
    boolean b = wifi.enableNetwork(res, true);    
    Log.d("WifiPreference", "enableNetwork returned " + b );   

    tv.setText("You are now connected!  " +
            "Version 1.1");

    status.setText("The was an error connecting, please try again.");

       //@Override

    try {

        Thread.sleep(5000);

         ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

         if (connec != null && (connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED) ||(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED)){  
                //You are connected, do something online. 
                setContentView(tv);

            }else if (connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED ||  connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) {              
                //Not connected.         
               setContentView(status);
            }  

    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }





}

public WifiConfiguration checkPreviousConfiguration(WifiConfiguration wc) {
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
 List<WifiConfiguration> configs = wifi.getConfiguredNetworks();     
    for(WifiConfiguration config : configs) {         
        if(config.SSID.equals(wc.SSID)) return config;     
        }     
    return wc; 
    } 

}
4

2 に答える 2

3

Thread.sleep(5000)これが遅延の原因だと思います。

基本的に、アプリに 5 秒間停止するように指示しています。

于 2012-04-19T19:50:25.920 に答える
1

上記のように、遅延の原因となっているのは Thread.sleep(5000) です。OnCreate は UI スレッドから呼び出されるため、全体が一時停止します。ランナブルを作成し、それを新しいスレッドのインスタンスで使用すると、UI スレッドを詰まらせずに、好きなだけ sleep() を呼び出すことができます。これが、多くの「XXX が応答しない」バグの主な原因です。または、スレッド化を行いたくない場合は、Android が提供する ASyncTask をご覧ください。

編集:

メッセージを表示したいだけなら、Toast が最適です。別のスレッドから UI にアクセスするのは少し面倒ですが、不可能ではありません。1 つの方法は、次のように、try ブロック全体を runnable にパッケージ化することです。

Runnable r = new Runnable(){
    @Override
    public void run(){
            try {

                Thread.sleep(5000);

                ConnectivityManager connec =(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

                if (connec != null && (connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED) ||(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED)){  
                    //You are connected, do something online. 
                    //Have to edit the UI on the UI thread
                    Runnable tempRun = new Runnable(){
                        @Override
                        public void run(){
                            setContentView(tv);
                        }
                    }
                    runOnUiThread(r);
                }else if (connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED ||  connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) {              
                    //Not connected. 
                    //NEEDS TO BE SAME AS ABOVE.        
                    setContentView(status);
                }  

           } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
     }
}

Thread t = new Thread(r);とを呼び出すことができますt.start();。私はそれをテストしていませんが、それが正確であると確信しています。setContentView 呼び出しはレイアウト全体を変更しますが、それはおそらくあなたが望むものではありませんが、この質問の範囲外です.

于 2012-04-19T20:17:15.810 に答える