1

私の主な活動には、インターネット ステータス TextView があります。その TextView で、インターネット接続が有効かどうかを表示したいと思います。10秒ごとにステータスを更新する必要があります。

別のスレッドでこれを行う必要があることはわかっていますが、多くのことを試しました。私は完璧な解決策を得ていません。

public class MainActivity extends Activity {
ImageView imageView;
TextView internetStausTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    internetStausTextView = (TextView) findViewById(R.id.tv1);

    new InternetChecker();
}

public class InternetChecker implements Runnable {
    Thread t;
    boolean internetStatus;
    ConnectivityManager conMgr;

    public InternetChecker() {
        t = new Thread(this);
        t.start();
        conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    }

    public void run() {
        while (true) {

            if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED
                    || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING) {
                internetStatus = true;

            } else if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED
                    || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) {
                internetStatus = false;

            }
            runOnUiThread(new Runnable() {
                public void run() {
                    if (internetStatus)
                        internetStausTextView.setText("connected");
                    else
                        internetStausTextView.setText("Not connected.");
                }
            });

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {

            }
        }
    }
}

}

これが私のコードです....しかし、アプリのパフォーマンスに影響を与えています。

サブクラス InternetChecker を別のファイルに取り出すのを手伝ってくれる人はいますか。

4

4 に答える 4

2

これを試して :

編集済み:

まずHandlerThread実行中のフラグを1 つ作成します。

Handler mHandler = new Handler();
boolean isRunning = true;

次に、 onCreate() メソッドからこのスレッドを使用します。

new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (isRunning) {
                    try {
                        Thread.sleep(10000);
                        mHandler.post(new Runnable() {

                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                // Write your code here to update the UI.
                                displayData();
                            }
                        });
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                }
            }
        }).start(); 

次に、10 秒ごとにハンドラーによって呼び出されるこのメソッドを宣言します。

private void displayData() {
        ConnectivityManager cn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo nf=cn.getActiveNetworkInfo();
        if(nf != null && nf.isConnected()==true )
        {
            Toast.makeText(this, "Network Available", Toast.LENGTH_SHORT).show();
            myTextView.setText("Network Available");
        }
        else
        {
            Toast.makeText(this, "Network Not Available", Toast.LENGTH_SHORT).show();
            myTextView.setText("Network Not Available");
        }       
    } 

スレッドを停止するには、これを呼び出します:

isRunning = false;

それでおしまい。

ありがとう。

于 2012-12-26T07:49:32.400 に答える
1

サービスを使用しないでください。

ユーザー TimerTask および Timer を使用して、インターネット接続を定期的にチェックおよび更新します。 タイマーから UI を更新することは、あなたのニーズの最良の例です。

ハッピーコーディング:)

于 2012-12-26T07:45:52.800 に答える
0
public boolean isNetworkAvailable(){
     ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo networkInfo = cm.getActiveNetworkInfo();
     if(networkInfo != null && networkInfo.isConnected()){
         Toast.makeText(this, "Network is available", Toast.LENGTH_LONG).show();
     } else {
         Toast.makeText(this, "Network is not available", Toast.LENGTH_LONG).show();
     }
    return true;
 }
于 2012-12-26T07:49:37.447 に答える