互联网连接检查线程Android

时间:2012-12-26 07:35:01

标签: android multithreading internet-connection

在我的主要活动中,有一个互联网状态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 个答案:

答案 0 :(得分:2)

试试这个:

已编辑:

首先创建一个HandlerThread正在运行的标记:

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;

就是这样。

感谢。

答案 1 :(得分:1)

不要使用服务。

用户TimerTask和Timer定期检查和更新互联网连接。 Updating the UI from a Timer是您需要的最佳示例。

快乐编码:)

答案 2 :(得分: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 );
        }
     });
}

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

答案 3 :(得分: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;
 }