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); 	}  } 


你可能感兴趣的:(android,线程,超时)