Android 中執行緒網路超時的處理
• android教程• 發佈:2018-10-02
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); }}