Android 中线程网络超时的处理
Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。
在下面的例子中使用了java 中的Timer类,对线程进行了约束,如果线程在一定时间内为响应则终止该线程。
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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {proDialog = ProgressDialog.show(MainActivity.this, "提示","线程运行中");// 匿名内部线程thread = new Thread() {@Overridepublic void run() {while (true) {try {//线程休眠时间,超时sleep(10000);} catch (InterruptedException e) {break;}}}};thread.start();// 设定定时器timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {sendTimeOutMsg();}}, TIME_LIMIT);}});// 测试超时的线程,为btn2绑定事件btn2.setOnClickListener(new OnClickListener() {@Overridepublic 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() {@Overridepublic void run() {sendTimeOutMsg();}}, TIME_LIMIT);}});}// 接收消息的Handlerfinal 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);}}