IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android网络之Android-Async-Http,软件开发常见面试题 -> 正文阅读

[移动开发]Android网络之Android-Async-Http,软件开发常见面试题

public class TwitterRestClient {

private static final String BASE_URL = “http://api.twitter.com/1/”;

private static AsyncHttpClient client = new AsyncHttpClient();

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);

}

private static Stri

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

ng getAbsoluteUrl(String relativeUrl) {

return BASE_URL + relativeUrl;

}

}

复制代码

封装的方法建议都加上Context参数,以在Activity pause或stop时取消掉没用的请求。

详细使用方法就不说了,直接看官方文档

其他说明及总结

=======

Android-Async-Http的使用非常简单,通过AsyncHttpClient发起请求就可以了,如果需要添加参数,直接传一个RequestParams过去,而且参数可以是String、File和InputStream,可以很方便地上传文件。

每个请求都需要传一个ResponseHandlerInterface的实例用以接收请求结果或请求失败,请求结束等通知,一般是AsyncHttpResponseHandler的子类。

通过BinaryHttpResponseHandler可以发起二进制请求,如请求图片。

通过TextHttpResponseHandler可以发起返回结果为字符串的请求,一般这个使用较多。

也可以使用它的子类JsonHttpResponseHandler,返回结果是一个JSONObject或JSONArray。不过感觉这个类作用不大,一是有另一个类BaseJsonHttpResponseHandler,可以直接解析返回的JSON数据,二是JsonHttpResponseHandler的方法太复杂了,有太多的onSuccess和onFailure方法,都不知道重写哪个了。

如上图所示,每个子类有太多的onSuccess和onFailure了,尤其是JsonHttpResponseHandler,这应该算是这个类库的不足吧。所以平时使用时基本不使用JsonHttpResponseHandler,而是直接使用TextHttpResponseHandler,当然也可以使用BaseJsonHttpResponseHandler。

这个类库还有一点不足,就是onSuccess等方法一般会在主线程执行,其实这么说不严谨,看代码吧:

复制代码

public AsyncHttpResponseHandler() {

boolean missingLooper = null == Looper.myLooper();

// Try to create handler

if (!missingLooper)

handler = new ResponderHandler(this);

else {

// There is no Looper on this thread so synchronous mode should be used.

handler = null;

setUseSynchronousMode(true);

Log.i(LOG_TAG, “Current thread has not called Looper.prepare(). Forcing synchronous mode.”);

}

// Init Looper by calling postRunnable without an argument.

postRunnable(null);

}

复制代码

可以看到,内部使用了Handler,当新建AsyncHttpResponseHandler的实例的时候会获取当前线程的Looper,如果为空就启用同步模式,即所有的回调都会在执行请求的线程中执行,当在一个普通的后台线程时这样执行是正常的,而我们一般都会在主线程发请请求,结果就是所有的回调都会在主线程中执行,这就限制了我们在onSuccess中执行耗时操作,比如请求成功后将数据持久化到数据库。

不过可以看到创建Handler的时候使用了Looper对象,所以我们就可以改进一下其构造函数,添加一个Looper参数(同步修改子类),这样所有的回调就都会在Looper所在线程执行,这样我们只需要开启一个HandlerThread就行了。但这样和Looper为空时一样有一个弊端,如果要更新UI操作的话,还需要向一个主线程的Handler发送消息让UI更新。还有第二个弊端,所有回调都在同一个HandlerThread中执行,如果一个处理耗时太久会阻塞后面的请求结果处理,如果只是简单地写个数据库影响应该不大,如果真耗时太久,为这个耗时处理再开个线程吧。

android-async-http开源项目可以是我们轻松的获取网络数据或者向服务器发送数据,使用起来非常简单,关于android-async-http开源项目的介绍内容来自于官方:http://loopj.com/android-async-http/.下面我对此主页上内容进行大体上的翻译,希望能够对你理解android-async-http开源项目有所帮助

1.1?Overview(概况)

An asynchronous callback-based Http client for Android built on top of Apache’s?HttpClient?libraries. All requests are made outside of your app’s main UI thread, but any callback logic will be executed on the same thread as the callback was created using Android’s Handler message passing.

译文:

异步基于回调的Http客户端为Android构建,是基于Apache HttpClient库的。所有的请求都是位于应用程序主线程 UI 之外,但任何回调逻辑将相同的线程上执行回调,使用Android的处理程序创建消息传递。

1.2?Features(特征)

  • Make?asynchronous?HTTP requests, handle responses in?anonymous callbacks

  • 进行异步HTTP请求,处理响应在匿名回调中完成

  • HTTP requests happen?outside the UI thread

  • HTTP请求发生在UI线程之外

  • Requests use a?threadpool?to cap concurrent resource usage

  • 请求使用threadpool,限制并发资源使用情况

  • GET/POST?params builder?(RequestParams)

  • GET / POST参数构建使用(RequestParams)

  • Multipart file uploads?with no additional third party libraries

  • Multipart?文件上传,没有额外的第三方库

  • Tiny size overhead to your application, only?25kb?for everything

  • 在你的应用程序上利用很小的开销,仅仅25 kb就可以做一切

  • Automatic smart?request retries?optimized for spotty mobile connections

  • 自动智能请求重试,优化了质量不一的移动连接

  • Automatic?gzip?response decoding support for super-fast requests

  • 自动解码支持gzip反应速度超快的请求

  • Binary file (images etc) downloading with?BinaryHttpResponseHandler

  • 二进制文件(图片等)的下载,使用BinaryHttpResponseHandler

  • Built-in response parsing into?JSON?with?JsonHttpResponseHandler

  • 内置响应解析成JSON,使用JsonHttpResponseHandler

  • Persistent cookie store, saves cookies into your app’s SharedPreferences

  • 持久化cookie存储,保存cookie到你的应用程序的SharedPreferences

  1. Installation & Basic Usage( 安装和基本用法)

Download the latest .jar file from github and place it in your Android app’s?libs/?folder.

从github上下载最新的最新的jar文件.并将其放置在你的Android应用程序的libs /文件夹.

2.1下载方式:

1.从http://loopj.com/android-async-http/的页面下载

点击DownLoad即可下载最新的jar文件

2.从https://github.com/loopj/android-async-http的页面下载

找到DownLoad ZIP进行下载文件,解压后的目录如下

examples:里面有简单的例子

library:里面存放的是android-async-http开源项目的源码(方法一:可以把library\src\main\java文件下面的文件拷贝到,你应用的src下也可以直接使用)

releases:里面存放的是各个版本的jar文件,(方法二:只需把最新的jar文件拷贝到你应用的libs目录下即可.)

samples:里面存放的也是例子(可供参考)

备注:方法一和方法二只能采用其中之一,建议采用方法二

2.2使用方法

Import the http package.

import com.loopj.android.http.*;

Create a new?AsyncHttpClient?instance and make a request:

AsyncHttpClient client = new AsyncHttpClient();

client.get(“http://www.google.com”, new AsyncHttpResponseHandler() {

@Override

public void onSuccess(String response) {

System.out.println(response);

}

});

Adding GET/POST Parameters with?RequestParams

The?RequestParams?class is used to add optional GET or POST parameters to your requests.RequestParams?can be built and constructed in various ways:

Create empty?RequestParams?and immediately add some parameters:

RequestParams params = new RequestParams();

params.put(“key”, “value”);

params.put(“more”, “data”);

Create?RequestParams?for a single parameter:

RequestParams params = new RequestParams(“single”, “value”);

Create?RequestParams?from an existing?Map?of key/value strings:

HashMap<String, String> paramMap = new HashMap<String, String>();

paramMap.put(“key”, “value”);

RequestParams params = new RequestParams(paramMap);

See the?RequestParams Javadoc?for more information.

Add an?InputStream?to the?RequestParams?to upload:

InputStream myInputStream = blah;

RequestParams params = new RequestParams();

params.put(“secret_passwords”, myInputStream, “passwords.txt”);

Add a?File?object to the?RequestParams?to upload:

File myFile = new File("/path/to/file.png");

RequestParams params = new RequestParams();

try {

params.put(“profile_picture”, myFile);

} catch(FileNotFoundException e) {}

arams`?to upload:

InputStream myInputStream = blah;

RequestParams params = new RequestParams();

params.put(“secret_passwords”, myInputStream, “passwords.txt”);

Add a?File?object to the?RequestParams?to upload:

File myFile = new File("/path/to/file.png");

RequestParams params = new RequestParams();

try {

params.put(“profile_picture”, myFile);

} catch(FileNotFoundException e) {}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 12:09:21  更:2021-12-05 12:10:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:54:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码