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

试试这个 :

编辑:

首先创建一个Handler运行Thread标志:

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 定期检查和更新互联网连接。 从 Timer 更新 UI是满足您需求的最佳示例。

快乐编码:)

于 2012-12-26T07:45:52.800 回答
1

首先,您需要创建一个 Timer 任务来检查网络连接

  _tv = (TextView) findViewById( R.id.TextViewTime );

    UpdateNetworkInfo();
  Timer _t = new Timer();
  String conn;
        _t.scheduleAtFixedRate( new TimerTask() {
            @Override
            public void run() {
                ConnectivityManager cn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo nf=cn.getActiveNetworkInfo();
    if(nf != null && nf.isConnected()==true )
    {
        conn = " Avaialable";
    }
    else
    {
        conn = " Not Available";
    }   
            }
        }, 1000, 1000 );

然后在 UI 线程中更新网络信息。

protected void UpdateNetworkInfo() 
{
     runOnUiThread(new Runnable() 
     {
    public void run() 
    {
            _tv.setText( "Network" + conn );
        }
     });
}

不要忘记为清单文件添加适当的权限。

于 2012-12-26T08:00:00.573 回答
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 回答