Ksoap2-android 添加網絡超時的實現


  最近做一個項目,用的Ksoap2進行的WebService調用,開始的時候沒有發現什么問題,后來測試的時候發現,當在測試環境沒有外網ip的時候進行登錄的時候總是提示正在登錄,很長時間沒有反應。因為當時手機用的是3G網絡,根本訪問不到測試的地址,這時問題就這樣出現了,查看Ksoap的API根本沒有設置網絡超時的相關方法,只能求助網絡進行解答,可是費勁了各種力量還是沒有找到可行的解決方案,最后在仔細觀察Ksoap源代碼的時候卻發現了其中的端倪,最后的解決方法也就這樣有了,下面給出自己的解決方案,如果您有幸碰到了這個問題而且正在不知道怎么解決發愁的時候,希望這篇文章能給您一些幫助,本來這篇文章很早就該寫的,可是最近太忙了,沒來得及寫,下面是我的實現方式(我是通過繼承類進行了重寫):

  首先是實現ServiceConnection接口,實現其中的一系列方法,代碼如下:

package com.miteno.fpsearch.utils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.ksoap2.transport.ServiceConnection;

/**
 * 繼承了HttpTransportSE ,添加請求超時的操作
 * 
 * @author wsx
 * 
 */

public class ServiceConnectionSE implements ServiceConnection {
    private HttpURLConnection connection;

    public ServiceConnectionSE(String url) throws IOException {
        this.connection = ((HttpURLConnection) new URL(url).openConnection());
        this.connection.setUseCaches(false);
        this.connection.setDoOutput(true);
        this.connection.setDoInput(true);
    }

    public void connect() throws IOException {
        this.connection.connect();
    }

    public void disconnect() {
        this.connection.disconnect();
    }

    public void setRequestProperty(String string, String soapAction) {
        this.connection.setRequestProperty(string, soapAction);
    }

    public void setRequestMethod(String requestMethod) throws IOException {
        this.connection.setRequestMethod(requestMethod);
    }

    public OutputStream openOutputStream() throws IOException {
        return this.connection.getOutputStream();
    }

    public InputStream openInputStream() throws IOException {
        return this.connection.getInputStream();
    }

    public InputStream getErrorStream() {
        return this.connection.getErrorStream();
    }

    // 設置連接服務器的超時時間,毫秒級,此為自己添加的方法
    public void setConnectionTimeOut(int timeout) {
        this.connection.setConnectTimeout(timeout);
    }
}

 

接下來是要繼承HttpTransportSE 類,覆寫其中的getServiceConnection方法,代碼如下:

package com.miteno.fpsearch.utils;

import java.io.IOException;

import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.transport.ServiceConnection;

/**
 * 繼承了HttpTransportSE ,添加請求超時的操作
 * 
 * @author wsx
 * 
 */
public class MyAndroidHttpTransport extends HttpTransportSE {

    private int timeout = 30000; // 默認超時時間為30s

    public MyAndroidHttpTransport(String url) {
        super(url);
    }

    public MyAndroidHttpTransport(String url, int timeout) {
        super(url);
        this.timeout = timeout;
    }

    @Override
    protected ServiceConnection getServiceConnection() throws IOException {
        ServiceConnectionSE serviceConnection = new ServiceConnectionSE(url);
        serviceConnection.setConnectionTimeOut(timeout);

        return serviceConnection;
    }
}

然后接下來是使用:

    //AndroidHttpTransport httpTranstation = new AndroidHttpTransport(serviceUrl + "?WSDL"); 這里注釋掉,原始的調用方法
                MyAndroidHttpTransport httpTranstation = new MyAndroidHttpTransport(serviceUrl + "?WSDL", 1000 * 80);
                

這樣問題就解決了。

 

補充內容:

今天發現ksoap2-android-assembly-3.1.0-jar-with-dependencies.jar把這個問題修復了可以直接來設置超時時間了,

HttpTransportSE se=new HttpTransportSE(url, timeout);//第二個參數就是超時時間

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM