`
龙哥IT
  • 浏览: 254059 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

androidasynchttp开源项目的GET或POST方式实现

 
阅读更多
android-async-http是一个强大的网络请求库,这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。
android-async-http是一个强大的第三方开源网络请求库,

官网源码:https://github.com/loopj/android-async-http

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


这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。

主要类介绍

AsyncHttpRequest

继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息


AsyncHttpResponseHandler

接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息


TextHttpResponseHandler

继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法,将请求结果由byte数组转换为String


JsonHttpResponseHandler

继承自TextHttpResponseHandler,同样是重写onSuccess和onFailure方法,将请求结果由String转换为JSONObject或JSONArray


BaseJsonHttpResponseHandler

继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类需要提供实现,将请求结果解析成需要的类型,子类可以灵活地使用解析方法,可以直接原始解析,使用gson等。


RequestParams

请求参数,可以添加普通的字符串参数,并可添加File,InputStream上传文件


AsyncHttpClient

核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。


SyncHttpClient

继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法。


服务器端php测试代码:

<?php
$data = array(
'status'=>'success', 
'get'=>json_encode($_GET), 
'post'=>json_encode($_POST),
'upload'=>json_encode($_FILES)
);
echo json_encode($data);

?>

android客户端测试代码:

package com.penngo.http;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.FileAsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

public class HttpUtil {
    private static final String BASE_URL = "http://192.168.17.99/";

    private static AsyncHttpClient client = new AsyncHttpClient();

    public static void setTimeout(){
        client.setTimeout(60000);
    }

    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
        client.get(getAbsoluteUrl(url), params, responseHandler);
    }

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
        client.post(getAbsoluteUrl(url), params, responseHandler);
    }

    public static void download(String url, RequestParams params, FileAsyncHttpResponseHandler fileAsyncHttpResponseHandler){
        client.get(getAbsoluteUrl(url), params, fileAsyncHttpResponseHandler);
    }

    private static String getAbsoluteUrl(String relativeUrl) {
        return BASE_URL + relativeUrl;
    }
}
package com.penngo.http;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.loopj.android.http.FileAsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.TextHttpResponseHandler;

import org.apache.http.Header;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;

public class MainActivity extends Activity {
    private final static String tag = "MainActivity-->";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button getBtn = (Button)this.findViewById(R.id.getBtn);
        getBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                testGet();
            }
        });
        Button postBtn = (Button)this.findViewById(R.id.postBtn);
        postBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                testPost();
            }
        });

        Button upLoadBtn = (Button)this.findViewById(R.id.upLoadBtn);
        upLoadBtn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                testUploadFile();
            }
        });

        Button downloadBtn = (Button)this.findViewById(R.id.downloadBtn);
        downloadBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                testDownloadFile();
            }
        });
    }

    private void testGet(){
        HttpUtil.get("test/android.php", getParames(), responseHandler);
    }

    private RequestParams getParames(){
        RequestParams params = new RequestParams();
        params.put("user", "penngo");
        params.put("psw", "penngo");
        return params;
    }

    private TextHttpResponseHandler responseHandler =  new TextHttpResponseHandler(){
        @Override
        public void onStart() {
            Log.e(tag, "onStart====");
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, String response) {
            Log.e(tag, "onSuccess====");
            StringBuilder builder = new StringBuilder();
            for (Header h : headers) {
                String _h = String.format(Locale.US, "%s : %s", h.getName(), h.getValue());
                builder.append(_h);
                builder.append("\n");
            }
            Log.e(tag, "statusCode:" + statusCode + " headers:" + builder.toString() + " response:" + response);
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, String errorResponse, Throwable e) {
            Log.e(tag, "onFailure====");
            StringBuilder builder = new StringBuilder();
            for (Header h : headers) {
                String _h = String.format(Locale.US, "%s : %s", h.getName(), h.getValue());
                builder.append(_h);
                builder.append("\n");
            }
            Log.e(tag, "statusCode:" + statusCode + " headers:" + builder.toString(), e);
        }

        @Override
        public void onRetry(int retryNo) {
            // called when request is retried
        }
    };

    private void testPost(){
        HttpUtil.post("test/android.php", getParames(), responseHandler);
    }

    private void testUploadFile(){
        RequestParams params = new RequestParams();
        try {
            InputStream is = this.getAssets().open("png/launcher.png");
            String png = this.getExternalCacheDir().getAbsolutePath() + "/launcher.png";
            File myFile = new File(png);
            Log.e(tag, "png====" + png);
            this.copyToSD(png, "png/launcher.png");
            params.put("pngFile", myFile, RequestParams.APPLICATION_OCTET_STREAM);
        } catch(Exception e) {
            Log.e(tag,"上传失败", e);
        }
        HttpUtil.post("test/android.php", params, responseHandler);
    }

    private void testDownloadFile(){
        String mp3 = this.getExternalCacheDir().getAbsolutePath() + "/fa.mp3";
        File mp3File = new File(mp3);
        FileAsyncHttpResponseHandler fileHandler = new FileAsyncHttpResponseHandler(mp3File){
            public void onSuccess(int statusCode, Header[] headers, File file){
                Log.e(tag, "onSuccess====");
                StringBuilder builder = new StringBuilder();
                for (Header h : headers) {
                    String _h = String.format(Locale.US, "%s : %s", h.getName(), h.getValue());
                    builder.append(_h);
                    builder.append("\n");
                }
                Log.e(tag, "statusCode:" + statusCode + " headers:" + builder.toString() + " file:" + file.getAbsolutePath());
            }
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file){

            }
        };
        HttpUtil.download("test/fa.mp3", null, fileHandler);
    }
    /**
     * 复制文件到sdcard
     */
    private void copyToSD(String strOut, String srcInput) throws IOException
    {
        InputStream myInput;
        OutputStream myOutput = new FileOutputStream(strOut);
        myInput = this.getAssets().open(srcInput);
        byte[] buffer = new byte[1024];
        int length = myInput.read(buffer);
        while(length > 0)
        {
            myOutput.write(buffer, 0, length);
            length = myInput.read(buffer);
        }

        myOutput.flush();
        myInput.close();
        myOutput.close();
    }
}

 

分享到:
评论

相关推荐

    C++实现HTTP GET,POST请求

    本篇文章将详细探讨如何使用C++来实现HTTP GET和POST请求,以及涉及HTTPS的安全连接。 HTTP GET请求是HTTP协议中最基础的操作之一,主要用于从服务器获取资源。GET请求的所有参数都包含在URL中,因此它是透明且可...

    基于Java开源项目的J2EE应用框架实现(论文)

    基于Java开源项目的J2EE应用框架实现(论文).kdh

    VC通过HttpGet和HttpPost方式与WebService通信,解析返回的Json

    可以使用开源的Json库,如jsoncpp或nlohmann/json,来帮助解析Json字符串。这些库提供了API,可以将Json字符串转换为C++对象,然后通过遍历这个对象,提取出所需的数据。 例如,假设Json响应如下: ```json { ...

    为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器

    为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序...

    优秀开源项目(基于VC++和MFC)(基于VC++和MFC的一些优秀开源项目)

    基于VC++和MFC的一些优秀开源项目列表 包括7-Zip,eMule,FileZilla,MiKTeX,Nokia Composer等优秀项目,有兴趣的同行可以参考参考。

    c++封装curl,实现get,post,download

    本篇将深入探讨如何在C++中封装libcurl,实现GET、POST请求以及文件下载功能。 首先,我们从`curlpp`这个库开始。`curlpp`是libcurl的一个C++包装器,它提供了更方便、面向对象的API,简化了与libcurl的交互。要...

    开源项目-soheilhy-goget.zip

    综上所述,【开源项目-soheilhy-goget.zip】是一个致力于简化Go语言新手入门体验的项目,通过goget工具提供了一种便捷的环境安装方式。它涉及了Go语言环境的搭建、跨平台支持、源代码管理和开源社区协作等多个方面的...

    采用 HttpClient GET、POST 方式 提交数据到服务器

    ### 使用HttpClient通过GET和POST方式提交数据到服务器 在现代Web开发中,客户端与服务器之间的交互至关重要。HTTP协议是Web应用中最常用的通信协议之一,而HttpClient则是Java中用于发送HTTP请求的强大工具。本文...

    前端开源库-get-package

    在前端开发领域,开源库是开发者们不可或缺的资源,它们提供了丰富的功能,帮助开发者们高效地构建和维护项目。"get-package"是一个专门用于前端的开源库,它的主要功能是根据指定的路径从本地disk或npm(Node.js的...

    Python爬虫开源项目代码

    Python爬虫开源项目代码是学习和实践Python网络爬虫技术的重要资源。这些开源项目提供了丰富的示例和实践经验,涵盖了各种爬虫技术的应用场景,对于初学者和进阶者都有很大的帮助。下面将详细阐述Python爬虫相关的...

    用开源项目实现有进度的Button

    标题“用开源项目实现有进度的Button”中的“开源项目”指的是利用社区共享的代码库来创建具有特定功能的应用组件。这种做法不仅节省了开发时间,还能确保代码的质量和兼容性。在这种情况下,我们可以找到专门为...

    前端开源库-get-package-dir

    在前端开发领域,开源库是开发者们常用的工具,它们...在探索`get-package-dir-master`这个压缩包的内容时,我们可以查看源代码、示例和文档,以深入了解其内部实现和使用方式,从而更好地将其融入到自己的开发实践中。

    蓝湖移动端辅助工具开源项目下载

    蓝湖移动端辅助工具是一款专为开发者设计的开源项目,旨在简化移动端开发过程中控件属性的复制和粘贴操作。此工具的最新版本为v1.0.2,它能够极大地提高开发效率,尤其是在处理iOS和Android平台上的布局时。通过一键...

    Java最著名的开源项目

    在Java的生态系统中,存在诸多著名的开源项目,这些项目各有特色,为Java开发人员提供了丰富的开发工具和应用架构。以下是对一些Java著名开源项目的详细介绍,它们分别在不同的开发领域中扮演着重要角色。 首先,...

    开源项目-mbialon-getrand.zip

    开源项目“mbialon-getrand”是一个用于生成伪随机数据的实用工具,旨在为用户提供一个友好且易于使用的界面。在编程和数据分析过程中,有时我们需要模拟真实数据,这正是getrand项目的目标。它可以帮助开发者和研究...

    AndroidAsyncHttp

    AndroidAsyncHttp是一个流行的开源库,专门用于在Android平台上进行异步网络请求。它由Loopj开发,旨在简化HTTP客户端操作,使开发者能够更方便地处理网络通信任务,而无需关心线程管理、回调处理等复杂细节。这个库...

    HttpClient发送http请求(post和get)需要的jar包+内符java代码案例+注解详解

    这个压缩包可能包含了实现HTTP GET和POST请求所需的jar包以及示例代码,帮助开发者理解如何使用HttpClient进行网络通信。下面将详细介绍HttpClient库,HTTP请求的基本概念,以及GET和POST方法的差异。 HttpClient是...

    android开源项目

    【标题】"Android开源项目"涉及的是Android操作系统平台上的开源代码项目,这通常指的是开发者公开分享的源代码,供其他开发者学习、使用或改进。在Android开发领域,开源项目不仅有助于提升开发效率,还能促进技术...

    http接口通用调试工具,支持get、post、put、patch、delete方法

    6. **bin文件夹**:在压缩包中看到的"bin"文件夹通常包含编译后的可执行程序或库文件,这意味着用户可以直接运行或引用这些文件来进行调试工作,无需复杂的安装步骤。 通过使用这样一个通用的HTTP接口调试工具,...

Global site tag (gtag.js) - Google Analytics