1. 程式人生 > >Android Http請求網路模擬超時

Android Http請求網路模擬超時

http://zhang247124629.iteye.com/blog/1490102

在Android平臺上,Http請求網路有可以設定連線超時的API(conn.setConnectTimeout),在J2ME平臺上就沒有該API了。於是小阿哥今天小模擬一下。閒話不說了。上程式碼。

Java程式碼  收藏程式碼
  1. package com.aisidi.age.handler;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.InputStream;  
  4. import java.net.HttpURLConnection;  
  5. import
     java.net.URL;  
  6. import android.graphics.Bitmap;  
  7. import android.graphics.BitmapFactory;  
  8. /** 
  9.  *  
  10.  * @author 小阿哥 
  11.  * @date 2012-04-19 
  12.  *  
  13.  * */  
  14. public class Http {  
  15.     private static Http http;  
  16.     private HttpURLConnection conn;//連線。  
  17.     private boolean isResponse;//是否有響應。。  
  18.     private boolean
     isConnecting;//是否正在連線中。  
  19.     private int connectTimeout;//連線超時時間。  
  20.     private Http() {  
  21.     }  
  22.     public static Http getInstance() {  
  23.         if (http == null) {  
  24.             http = new Http();  
  25.         }  
  26.         return http;  
  27.     }  
  28.     /** 
  29.      * 根據URL獲得資料。位元組陣列。 
  30.      * */  
  31.     public byte
    [] getContentFromUrl(final String Url) {  
  32.         if(this.connectTimeout!=0)  
  33.         {  
  34.             this.startTimer();  
  35.         }  
  36.         byte contentArray[] = null;  
  37.         isResponse = false;  
  38.         isConnecting = true;          
  39.         try {  
  40.             URL httpUrl = new URL(Url);  
  41.             conn = (HttpURLConnection) httpUrl  
  42.                     .openConnection();            
  43.             int responseCode = conn.getResponseCode();  
  44.             if (responseCode == HttpURLConnection.HTTP_OK) {  
  45.                 contentArray = getByteArrayFromStream(conn.getInputStream());  
  46.             }  
  47.             httpUrl=null;  
  48.         } catch (Exception e) {  
  49.             Debug.println("getContentFromUrl Ex:" + e.toString());  
  50.         } finally {  
  51.             if (conn != null) {  
  52.                 conn.disconnect();  
  53.             }  
  54.         }  
  55.         if (contentArray != null) {  
  56.             this.isResponse = true;  
  57.         }  
  58.         isConnecting = false;  
  59.         return contentArray;  
  60.     }  
  61.     /** 
  62.      * 根據URL獲得相應圖片。 
  63.      * */  
  64.     public Bitmap getBitmapFromUrl(String url)  
  65.     {  
  66.         Bitmap bit=null;  
  67.         byte file[]=getContentFromUrl(url);  
  68.         if(file!=null)  
  69.         {  
  70.             bit=BitmapFactory.decodeByteArray(file, 0,file.length);  
  71.         }  
  72.         return bit;  
  73.     }     
  74.     /** 
  75.      * 設定連線超時。 
  76.      * */  
  77.     public void setConnectTimeout(final int connectTimeout)  
  78.     {  
  79.         this.connectTimeout=connectTimeout;  
  80.     }  
  81.     /** 
  82.      * 啟動計時器執行緒. 
  83.      * */  
  84.     private void startTimer()  
  85.     {  
  86.         Runnable runnable=new Runnable() {        
  87.             boolean isRun=true;  
  88.             long startTime=System.currentTimeMillis();  
  89.             long enableTime;  
  90.             @Override  
  91.             public void run() {  
  92.                 // TODO Auto-generated method stub  
  93.                 System.out.println("計時器執行緒 run start..isRun:"+isRun);                  
  94.                 while(isRun)  
  95.                 {                     
  96.                     enableTime=System.currentTimeMillis()-startTime;  
  97.                     if(isResponse||enableTime>=Http.this.connectTimeout)                   
  98.                     {                         
  99.                         System.out.println("計時器執行緒result str:"+(isResponse?("已經下載完畢了"):("時間延遲太長了強制關閉")));  
  100.                         isRun=false;  
  101.                         closeCurrentConnection();     
  102.                         break;  
  103.                     }  
  104.                     try{  
  105.                         Thread.sleep(50);  
  106.                     }catch (Exception e) {  
  107.                         System.out.println("計時器執行緒 sleep ex:"+e.toString());  
  108.                     }  
  109.                 }  
  110.                 System.out.println("計時器執行緒run..end time:"+enableTime);  
  111.             }  
  112.         };  
  113.         new Thread(runnable).start();  
  114.     }  
  115.     /** 
  116.      * 判斷當前連線是否正在連線中。。。。 
  117.      * */  
  118.     public boolean isConnecting() {  
  119.         return isConnecting;  
  120.     }  
  121.     /** 
  122.      * 關閉當前連線。 
  123.      * */  
  124.     public void closeCurrentConnection() {  
  125.         if (conn != null) {  
  126.             conn.disconnect();  
  127.             conn = null;  
  128.         }  
  129.         isResponse = false;  
  130.         isConnecting = false;  
  131.     }  
  132.     private byte[] getByteArrayFromStream(InputStream inputStream) {  
  133.         byte result[] = null;         
  134.         try {  
  135.             ByteArrayOutputStream outputStream = new ByteArrayOutputStream();  
  136.             byte buf[] = new byte[1024];  
  137.             int len;  
  138.             while ((len = inputStream.read(buf)) != -1) {  
  139.                 outputStream.write(buf, 0, len);  
  140.             }  
  141.             outputStream.flush();  
  142.             result = outputStream.toByteArray();  
  143.             outputStream.close();  
  144.             outputStream = null;  
  145.             inputStream.close();  
  146.         } catch (Exception e) {  
  147.             Debug.println("getStreamByteArray().EX:" + e.toString());  
  148.         }  
  149.         return result;  
  150.     }  
  151. }  

 以上程式碼是模擬連線超時的主要邏輯程式碼。親,上面的程式碼還有註釋喲,專門為你寫的。是不是很體貼啊。

Java程式碼  收藏程式碼
  1. package com.aisidi.age.handler;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.view.KeyEvent;  
  7. import android.view.View;  
  8. import android.widget.Toast;  
  9. /** 
  10.  *  
  11.  * @author 小阿哥 
  12.  * @date 2012-04-19 
  13.  *  
  14.  * */  
  15. public class MyView extends View implements Runnable{  
  16.     private static final int CONNECTION_TIMEOUT = 800;  
  17.     private static final String URL_DOWN_LOAD="http://ww3.sinaimg.cn/large/979d743fjw1ds3igt92dkj.jpg";  
  18.     private static final String CONNECTING_TOAST="正在連網中。請稍候在試。。";  
  19.     private Bitmap bitDownLoad;   
  20.     public MyView(Context context) {  
  21.         super(context);  
  22.         // TODO Auto-generated constructor stub       
  23.         new Thread(this).start();         
  24.         this.setFocusable(true);  
  25.         this.setFocusableInTouchMode(true);  
  26.     }  
  27.     @Override  
  28.     protected void onDraw(Canvas canvas) {  
  29.         // TODO Auto-generated method stub  
  30.         super.onDraw(canvas);         
  31.         canvas.drawColor(Color.BLACK);  
  32.         if(bitDownLoad!=null)  
  33.         {  
  34.             canvas.drawBitmap(bitDownLoad, 0,0,null);             
  35.         }  
  36.     }  
  37.     @Override  
  38.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  39.         // TODO Auto-generated method stub  
  40.         if(keyCode==KeyEvent.KEYCODE_BACK)//當按返回鍵時,請求網路下載圖片。  
  41.         {             
  42.             if(Http.getInstance().isConnecting())  
  43.             {  
  44.              Toast.makeText(this.getContext(), CONNECTING_TOAST, Toast.LENGTH_LONG).show();  
  45.             }  
  46.             else  
  47. 相關推薦

    Android Http請求網路模擬超時

    http://zhang247124629.iteye.com/blog/1490102 在Android平臺上,Http請求網路有可以設定連線超時的API(conn.setConnectTimeout),在J2ME平臺上就沒有該API了。於是小阿哥今天小模擬一下。閒話

    Android HTTP 請求超過超時時間未返回 報錯java.net.UnknownHostException: Unable to resolve host

    現象:手機連線WIFI,但未連線外網。設定urlCon.setConnectTimeout(5000);  urlCon.setReadTimeout(8000);  在Android傳送Http請求時,時間超過設定的超時時間仍未返回。HTTP框架使用的是開源的Androi

    android http請求訪問介面的封裝

    轉自 https://www.cnblogs.com/you411305469/p/5212479.html 裡面介紹了實用的兩種 要特別注意,向php請求資料是表單型別的資料 application/x-www-form-urlencoded import android.os

    Android通過請求網路獲取圖片資源

    在日常的編寫Android軟體的過程中,避免不了使用網路請求,也不可能使用單機的Android,所以本次講的是通過Android傳送網路請求請求圖片的文章。 我先來總結一下網路請求的幾個步驟:   1、將想要請求的圖片地址轉換成URL類   2、通過openConnection來建立連線

    Android Http請求失敗解決方法

    1、MainActivity.java 檔案中的onCreate方法改成如下: @SuppressLint("NewApi") @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCrea

    Android http請求使用介面回撥

    Android中不支援在主執行緒發起http請求資料,我們需要把http請求放到子執行緒中處理。為了保證程式碼的執行順序,可以使用介面回撥的方式拿到請求到的資料並進行處理。 定義回撥介面 public interface OnConnectResult

    Android Http請求方法彙總

    這篇文章主要實現了在Android中使用JDK的HttpURLConnection和Apache的HttpClient訪問網路資源,服務端採用python+flask編寫,使用Servlet太麻煩了。關於Http協議的相關知識,可以在網上檢視相關資料。程式碼比較簡單,就不

    Android基礎入門教程——7.1.4 Android HTTP請求方式-HttpClient

    Android基礎入門教程——7.1.4 Android HTTP請求方式:HttpClient 標籤(空格分隔): Android基礎入門教程 本節引言: 在上一節中我們對HttpURLConnection進行了學習,本節到第二種方式:Ht

    Android HTTP請求方式:HttpURLConnection

    1.HttpURLConnection的介紹 答:一種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操作可以適用於大多數的應用程式。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴充套件它。繼承至URLCo

    android http請求實現session管理

    session一般儲存在Cookie當中,首先我們瞭解一下session和cookie Cookie和Session都為了用來儲存狀態資訊,都是儲存客戶端狀態的機制,它們都是為了解決HTTP無狀態的問題而所做的努力。 Session可以用Cookie來實現,也可

    HTTP基礎與Android——HTTP請求頭響應頭

    一、HTTP頭資訊解讀: HTTP的頭域包括通用頭、請求頭、響應頭和實體頭四個部分。每個頭域由一個域名,冒號(:)和域值三部分組成(說白了就是鍵值對)。 通用頭:是客戶端和伺服器都可以使用的頭部,可以在客戶端、伺服器和其他應用程式之間提供一些非

    解決android http請求帶中文引數會亂碼(url編碼)

    今天在用android 的 URL url = new URL("http://www.my400800.cn &search=400電話 ");   HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnectio

    AndroidHttp通訊——4.Android HTTP請求方式:HttpClient

    本節引言: 上節講了HttpURLConnection,本節就到HttpClient了,Apache給我們提供的HttpClient(簡單的Http客戶端),不過畢竟不是親兒子,HttpClient在API 21版本後就給Google棄用了,而我

    Android HTTP協議請求網路(三)之HttpURLConnection方式

    為了演示HttpURLConnection的常見用法,我做了一個App,介面如下所示:主介面MainActivity有四個按鈕,分別表示用GET傳送請求、用POST傳送鍵值對資料、用POST傳送XML資料以及用POST傳送JSON資料,點選對應的按鈕會啟動NetworkActivity並執行相應的操作。Net

    android retrofit設定網路請求超時時間

    今天開發的時候遇到一個網路請求超時的問題,後臺處理是成功的,但是移動端返回的總是提示請求超時,在設定了retrofit請求超時的時間延長以後,就可以請求成功了,下面是配置的方法: private static final OkHttpClient client =

    Android 網路請求登入後更新頁面實現 Handler+HTTP請求詳解

    為了實現登入功能,我們需要一下幾步:1、獲取UI資料,並向伺服器傳送請求2、等待返回資料,解析3、將返回資料更新到UI執行緒中為了完成以上幾步,我根據每步的功能提出自己的解決方法,順便整理出對應的知識供大家參考。Handler眾所周知,Android程式執行會開啟一個UI執行

    Android使用HTTP協議訪問網路和OkHttp傳送HTTP請求

    對於Android開發來說,我們只需要瞭解一些就足夠了。它的工作原理很簡單,就是客戶端向伺服器傳送一條HTTP請求,伺服器收到請求之後會返回一些資料給客戶端,然後客戶端再對這些資料進行解析和處理就可以了。Android上傳送HTTP請求一般有兩種方式:HttpURLConne

    httpclient傳送http請求設定網路超時時間

    一、傳送的ApiClient方法 可以設定網路超時時間 /*** Eclipse Class Decompiler plugin, copyright (c) 2016 Chen Chao ([email protected]) ***/ pack

    Android HTTP協議請求網路(二)之HttpClient方式

    1 package com.example.m04_http01; 2 3 import org.apache.http.HttpEntity; 4 import org.apache.http.HttpResponse; 5 import org.apache.http.client.HttpC

    Android http網路請求框架搭建

    android上網路請求大致分為使用socket和http,普通應用大多使用http或者https,今天主要介紹http,實現目標通過使用http搭建一套簡單的Android網路請求框架。 網路請求部分: Android的網路請求部分我們大致分為: 引數傳遞,網路請求,