在我的主要活动中,有一个互联网状态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取出到一个单独的文件中。
答案 0 :(得分: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;
就是这样。
感谢。
答案 1 :(得分:1)
答案 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;
}