Android 中線程網絡超時的處理

jopen 11年前發布 | 50K 次閱讀 Android 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!