Android 中線程網絡超時的處理
Android開發中經常需要調用線程訪問網絡,而手機的網絡信號經常斷斷續續,容易出現網絡超時的情況,這種情況下后臺線程往往得不到關閉,浪費系統資源。
在下面的例子中使用了java 中的Timer類,對線程進行了約束,如果線程在一定時間內為響應則終止該線程。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); }
} </pre>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!