2012-04-19 13 views
-2

私は以下のコードを使用してWi-Fiに接続しています。アプリが読み込まれると、黒い画面が表示され、ボタンがWi-Fiから切断されたように見えます。ボタンがすぐに見えるようにする方法はありますか?また、アプリケーションの読み込みの進行状況を表示する方法もありますので、ユーザーはそれが掛かっているとは思わないでしょうか?Androidアプリの読み込みに時間がかかります

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; 
    } 

} 

答えて

3

私はThread.sleep(5000)が遅延の原因であると想像します。

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

+2

+1そしてどこでも 'Thread.sleep(n)'を使うべきではないことに注意してください。 –

1

前述したように、その遅延を引き起こすThread.sleep(5000)です。 OnCreateはUIスレッドから呼び出されるため、すべてが一時停止します。 runnableを作成して新しいスレッドのインスタンスで使用すると、UIスレッドを窒息させることなくsleep()を呼び出すことができます。これが、多くの「XXXが応答していない」バグの主な原因です。または、スレッドに入りたくない場合は、Androidが提供するASyncTaskを見てください。

EDIT:

あなただけのメッセージを表示したい場合は、トーストを行うための最善のことです。別のスレッドからUIにアクセスするのは少し面倒ですが、不可能ではありません。

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();を呼び出すことができます。一つの方法はそうのように、実行可能に全体tryブロックをパッケージ化することです。私はそれをテストしていませんが、私はかなり確かに正確です。 setContentViewの呼び出しはレイアウト全体を変更し、おそらくあなたが望むものではありませんが、この質問の対象外です。

+0

ありがとう、私がやった理由は、まだ動作していたときに無線LANが接続されたというメッセージを表示したくないからです。それは私がまだ仕事を待つことができる方法があると言われている?または、何らかの形で接続されている場合にのみメッセージを表示しますか? – user1342164

+0

まだコメントシステムに慣れています... – Flynny75

関連する問題