Android 中线程网络超时的处理
Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。
在下面的例子中使用了java 中的Timer类,对线程进行了约束,如果线程在一定时间内为响应则终止该线程。
[java][/java] view plaincopy
- package com.zf.thread_test;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.app.Activity;
- import android.app.ProgressDialog;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private static final int TIME_OUT = 0;
- private static final int SUCCESS = 1;
- // 超时的时限为5秒
- private static final int TIME_LIMIT = 5000;
- ProgressDialog proDialog;
- Timer timer;
- Thread thread;
- Button btn1, btn2;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btn1 = (Button) findViewById(R.id.button1);
- btn2 = (Button) findViewById(R.id.button2);
- // 测试未超时的线程,为btn1绑定事件
- btn1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- proDialog = ProgressDialog.show(MainActivity.this, “提示”,
- “线程运行中”);
- // 匿名内部线程
- thread = new Thread() {
- @Override
- public void run() {
- while (true) {
- try {
- //线程休眠时间,超时
- sleep(10000);
- } catch (InterruptedException e) {
- break;
- }
- }
- }
- };
- thread.start();
- // 设定定时器
- timer = new Timer();
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- sendTimeOutMsg();
- }
- }, TIME_LIMIT);
- }
- });
- // 测试超时的线程,为btn2绑定事件
- btn2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- proDialog = ProgressDialog.show(MainActivity.this, “提示”,
- “线程运行中”);
- // 匿名内部线程
- thread = new Thread() {
- public void run() {
- try {
- // 线程休眠时间,未超时
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Message msgSuc = new Message();
- msgSuc.what = SUCCESS;
- myHandler.sendMessage(msgSuc);
- }
- };
- thread.start();
- // 设定定时器
- timer = new Timer();
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- sendTimeOutMsg();
- }
- }, TIME_LIMIT);
- }
- });
- }
- // 接收消息的Handler
- final Handler myHandler = new Handler() {
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case TIME_OUT:
- //打断线程
- thread.interrupt();
- proDialog.dismiss();
- Toast.makeText(MainActivity.this, “线程超时”, Toast.LENGTH_SHORT)
- .show();
- break;
- case SUCCESS:
- //取消定时器
- timer.cancel();
- proDialog.dismiss();
- Toast.makeText(MainActivity.this, “线程运行完成”, Toast.LENGTH_SHORT)
- .show();
- break;
- default:
- break;
- }
- };
- };
- //向handler发送超时信息
- private void sendTimeOutMsg() {
- Message timeOutMsg = new Message();
- timeOutMsg.what = TIME_OUT;
- myHandler.sendMessage(timeOutMsg);
- }
- }