无需二次开发,Cloud Alert 快速衔接您的IT事件和钉钉通知
823
2022-09-25
如何用 Retrofit 2 在安卓上实现 HTTP 访问?(如何用ps修改图片上的文字)
最近,笔者对安卓开发的兴趣愈发浓厚,而且不断尝试了许多传闻很棒的开发库 -- 大部分也真的很不错。于是打算写一个系列文章,介绍使用这些让人惊叹的库建立安卓示例应用的实践。这样,读者可以自行判断,这些库有多好用。本文是该系列的第一篇。
类型安全 HTTP 客户端主要意味着,你只需关心发送出去的网络请求的语义,而不必考虑 URL 构建的细节,以及参数设定是否正确之类的事。Retrofit应对这些易如反掌,你只需写几个接口即可。就是这么简单!
好在我们只是弄个“玩具”项目而已,因此我们可以大胆地选择最新的 SDK,然后快速掠过项目向导,进入我们伟大的「hello world」安卓应用。
说明一下,我在 ZeoTurnaround 公司工作,也就是创造JRebel for Android的公司。但它真的很好用,你值得一试。
点一下浮动按钮,出现 snackbar。看起来不错。让我们随意更改一段代码,检验一下代码重新加载的功能。笔者首先想到的是修改 snackbar 的字符串值。
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, “Super fast hello world”, Snackbar.LENGTH_LONG) .setAction(“Action”, null).show(); }});
compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta2’ compile ‘com.squareup.retrofit2:gson-converter:2.0.0-beta2’
Retrofit 的主要功能是可以在运行时生成代码,发送 HTTP服务查询请求。开发者只需写一个“说明”接口即可。假设我们有如下的一个 model 类:
通过这个我们可以创建一个名为GithubService的接口,用于实现 HTTP 通信。
public interface GitHubService { @GET(“repos/{owner}/{repo}/contributors”) Call> repoContributors( @Path(“owner”) String owner, @Path(“repo”) String repo);}
This is the simplest example, we add the @GET annotation on an interface method and provide the path part of the URL that we want to expose it on. Conveniently, the method parameters can be referenced in the path string so you won’t need to jump through hoops to set those. Additionally, with other annotations you can specify query parameters, POST request body and so on:
@Query(“key”) — for GET request query parameter @QueryMap — for the map of parameters @Body — use it with the @POST annotation to provide the query body content.
这是一个最简单的例子。我们在接口方法中加入 @GET 注解,并且提供想要展示的 URL 的path部分。方便的是,由于可以在 path 字符串中引用方法参数,因此我们无需跳出循环再重新设定。另外,通过这些注解,你可以设定查询参数,以及 POST 请求主体等等:
@Query(“key”) -- 用于GET请求查询参数 @QueryMap -- 用于参数映射 @Body -- 与@POST注解一起使用,提供查询主体内容
下面,为了能在运行时使用这个接口,我们需要构建一个 Retrofit 对象:
笔者倾向于在包含网站请求的接口内使用 Retrofit builder。这么做并不是想让它变得复杂难懂。而是处于通用配置的考虑。例如,我们有默认的转换器,将 JSON 响应对象转为 Java 对象,但是,即使在每个 service 中复制粘贴一遍,也好过使用单一的抽象类,后者很容易造成泄漏。
With these pieces in place, we just need to perform the network call: - the specification of our queries - the Retrofit object builder准备好这些代码后,我们只需发出网络请求: - 请求的说明 - Retrofit对象builder
为了实现GitHubService接口,需要初始化一个用于执行 HTTP 查询请求的 Call 对象。
GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); Call> call = gitHubService.repoContributors(“square”, “retrofit”); List
另外,有人可能也会选择设定请求的时间,让它成为异步请求,同时在执行完毕后提供 callback。
call.enqueue(new Callback>() { @Override public void onResponse(Response
> response, Retrofit retrofit) { // handle success } @Override public void onFailure(Throwable t) { // handle failure }});
听起来超简单!我们来处理一下 UI,然后写入代码。在浮动按钮的应用模板下,我们需要修改 content_main.xml 文件。笔者添加了一个发起请求查询的按钮,以及一个用以显示请求结果的文本区域:
第一次执行时,你的网络请求代码看起来可能是这样的:
Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); Call> call = gitHubService.repoContributors(“square”, “retrofit”); String result = call.execute().body().toString(); TextView textView = (TextView) findViewById(R.id.textView); textView.setText(result); }});
接着,从 EventListener 中调用它:
Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); final Call> call = gitHubService.repoContributors("square", "retrofit"); new NetworkCall().execute(call); }});
好啦,现在代码可以运行了。文本视图会根据 HTTP 请求的结果实时刷新。
现在,这个框架应用程序已经完成了,代码顺利构建并运行完毕。你可以自己去试试 Retrofit和JRebel for Android 。随意修改一些代码,检查一下新代码构成的应用程序运行效果如何,也不会浪费任何时间。尝试为 Contributor 类增加几个区域,替换 contributor 组件的 文本视图,更改 HTTP 的端点,将请求发往另一个站点。一切尽在你掌握!
发表评论
暂时没有评论,来抢沙发吧~