个人技术博客(α)
项目联系
团队刚开始分配我负责前端网页的开发,我开始学习HTML、css和JS这些知识。后来我们团队决定放弃前端网页,因此我辗转到移动端,开始学安卓。因为起步比较晚,所以学的内容不是很扎实,为了跟上团队的步伐,在学习完基础的界面布局、事件和控件后,开始了网络请求的编码。
网络请求
我们团队使用OKHTTP处理网络请求,OKHTTP是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架。资料上显示,OkHttp 处理了很多网络疑难杂症,会从很多常用的连接问题中自动恢复。如果服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。
(1)HTTP GET
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) { return response.body().string();
}
else { throw new IOException("Unexpected code " + response);
}
}
Request是OkHttp中访问的请求,Builder是辅助类。Response即OkHttp中的响应。
(2)HTTP POST
POST提交Json数据
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder().url(url).post(body).build();
Response response = client.newCall(request).execute();
f (response.isSuccessful()) {
return response.body().string();
} else {
throw new IOException("Unexpected code " + response);
}
}
使用Request的post方法来提交请求体RequestBody
(3)我们团队使用Gson来解析JSON响应
private final OkHttpClient client = new OkHttpClient();
private final Gson gson = new Gson();
public void run() throws Exception {
Request request = new Request.Builder()
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Gist gist = gson.fromJson(response.body().charStream(), Gist.class);
for (Map.Entry<String, GistFile> entry : gist.files.entrySet()) {
System.out.println(entry.getKey());
System.out.println(entry.getValue().content);
}
}
static class Gist {
Map<String, GistFile> files;
}
static class GistFile {
String content;
}
ResponseBody.charStream()使用响应头Content-Type指定的字符集来解析响应体。
(4)这是我们的登录活动的Java代码:
package com.maple27.fzuyibao.view.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.maple27.fzuyibao.R;
import com.maple27.fzuyibao.presenter.util.ActivityController;
import com.maple27.fzuyibao.presenter.util.StatusBarUtil;
/**
* Created by Maple27 on 2017/11/3.
*/
public class LoginActivity extends AppCompatActivity {
private Button login;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityController.addActivity(this);
setContentView(R.layout.activity_login);
StatusBarUtil.setStatusBar(this);
login = (Button) findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityController.removeActivity(this);
}
}
这是我设计的登录界面的测试版本(仅供参考)
总结
以上是目前我学到的技术与团队项目的关系,网络请求还需要不断完善。