Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 中線程網絡超時的處理

Android 中線程網絡超時的處理

編輯:關於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);  
    }  
  
}  

 


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved