Android 非同步Http架構簡介和實現原理,android架構

來源:互聯網
上載者:User

Android 非同步Http架構簡介和實現原理,android架構

在前幾篇文章中《Android 採用get方式提交資料到伺服器》《Android 採用post方式提交資料到伺服器》《Android 採用HttpClient提交資料到伺服器》介紹了android的兩種提交資料到伺服器的方法

本文將介紹另外一種基於架構android-async-http的方法來實現

android-async-http是一個強大的網路請求庫,這個網路請求庫是基於Apache HttpClient庫之上的一個非同步網路請求處理庫,網路處理均基於Android的非UI線程,通過回調方法處理請求結果。android-async-http是一個強大的第三方開源網路請求庫

官網源碼:https://github.com/loopj/android-async-http

官網教程:http://loopj.com/android-async-http/

建立項目,先到github上:https://github.com/loopj/android-async-http/tree/1.4.0

下載相應的zip檔案,解壓縮後將src中的com檔案夾複製到項目的src目錄

下面使用架構android-async-http,代碼如下:

package com.wuyudong.asynchttp;import java.net.URLEncoder;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.AsyncHttpResponseHandler;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void click(View view) {        // 使用者名稱密碼提交到伺服器        AsyncHttpClient client = new AsyncHttpClient();        String path = "http://169.254.168.71:8080/web/LoginServlet?username="                + URLEncoder.encode("wuyudong") + "&password="                + URLEncoder.encode("123");        client.get(path, new AsyncHttpResponseHandler() {            @Override            public void onSuccess(String content) {                // TODO Auto-generated method stub                super.onSuccess(content);                Toast.makeText(MainActivity.this, "請求成功!", 0).show();            }            @Override            public void onFailure(Throwable error, String content) {                // TODO Auto-generated method stub                super.onFailure(error, content);                Toast.makeText(MainActivity.this, "請求失敗!", 0).show();            }        });    }}

可以看到代碼量減少了很多

下面來實現一個精簡版的非同步架構

建立項目

AsyncHttpClient.java

package com.wuyudong.AsyncClient;import java.io.IOException;import java.io.InputStream;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.os.Message;public class AsyncHttpClient {    public void get(final String path, final MyHandler myHandler) {        new Thread() {            @Override            public void run() {                HttpClient client = new DefaultHttpClient();                HttpGet httpGet = new HttpGet(path);                try {                    HttpResponse response = client.execute(httpGet);                    InputStream is = response.getEntity().getContent();                    String content = StreamTools.readInputStream(is);                    // 執行成功                    Message msg = new Message();                    msg.what = 0;                    msg.obj = "請求成功";                    myHandler.sendMessage(msg);                } catch (Exception e) {                    e.printStackTrace();                    // 執行失敗                    Message msg = new Message();                    msg.what = 1;                    msg.obj = "請求失敗";                    myHandler.sendMessage(msg);                }            }        }.start();    }}

MainActivity.java

package com.wuyudong.AsyncClient;import java.net.URLEncoder;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void click(View view) {        // 1、開啟子線程 執行一個http請求,在後台執行 在子線程執行        // 2、 子線程執行完畢後通知ui介面        AsyncHttpClient client = new AsyncHttpClient();        String path = "http://169.254.168.71:8080/web/LoginServlet?username="                + URLEncoder.encode("wuyudong") + "&password="                + URLEncoder.encode("123");        client.get(path, new MyHandler() {            @Override            public void onFailure(String content) {                Toast.makeText(MainActivity.this, content, 1).show();                super.onFailure(content);            }            @Override            public void onSuccess(String content) {                Toast.makeText(MainActivity.this, content, 0).show();                super.onSuccess(content);            }        });    }}

MyHandler.java

package com.wuyudong.AsyncClient;import android.os.Handler;import android.os.Message;public class MyHandler extends Handler {    public void onFailure(String content) {    }    public void onSuccess(String content) {    }    @Override    public void handleMessage(Message msg) {        String content = (String) msg.obj;        switch (msg.what) {        case 0:            onSuccess(content);            break;        case 1:            onFailure(content);            break;        default:            break;        }        super.handleMessage(msg);    }}

StreamTools.java

package com.wuyudong.AsyncClient;import java.io.ByteArrayOutputStream;import java.io.InputStream;public class StreamTools {    /**     * 把輸入資料流的內容轉化成字串     *      * @param is     * @return     */    public static String readInputStream(InputStream is) {        try {            ByteArrayOutputStream baos = new ByteArrayOutputStream();            int len = 0;            byte[] buffer = new byte[1024];            while ((len = is.read(buffer)) != -1) {                baos.write(buffer, 0, len);            }            is.close();            baos.close();            byte[] result = baos.toByteArray();            String str = new String(result);            // 試著解析result裡面的字串            if (str.contains("gb2312")) {                return new String(result, "gb2312");            } else if(str.contains("utf-8")){                return str;            } else {                return null;            }                        //return new String(result, "gb2312");        } catch (Exception e) {            e.printStackTrace();            return null;        }    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.