当前位置: 代码迷 >> Android >> Android 中线程网络超时的处置
  详细解决方案

Android 中线程网络超时的处置

热度:74   发布时间:2016-04-28 07:56:43.0
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;	@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);	}}


  相关解决方案