okhttp
一. okhttp协议介绍
okhttp是一个第三方类库,用于android中请求网络。
这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient).
二.okhttp完成get请求
buttonGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//TODO 1:client
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(1, TimeUnit.MINUTES);//连接超时
builder.connectTimeout(1,TimeUnit.MINUTES);//读取超时
OkHttpClient client = builder.build();
//TODO 2:request对象
Request.Builder builder1 = new Request.Builder();
builder1.url(geturl);
builder1.get();//设置请求方法
Request request = builder1.build();
//TODO 3:发起连接call
Call call = client.newCall(request);
//TODO 4:通过call得到response
call.enqueue(new Callback() {
@Override
//请求失败
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: "+e.getMessage());
}
//请求成功
@Override
public void onResponse(Call call, Response response) throws IOException {
//获得响应体:json串
ResponseBody body = response.body();
//通过body直接转成字符串
String json = body.string();
Message obtain = Message.obtain();
obtain.what=888;
obtain.obj=json;
handler.sendMessage(obtain);
}
});
}
});
三.okhttp完成post请求
buttonPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(1,TimeUnit.MINUTES);
builder.readTimeout(1,TimeUnit.MINUTES);
OkHttpClient client = builder.build();
//itemid=2&act=ad_app;
FormBody.Builder body = new FormBody.Builder();
body.add("act","column");
body.add("ctype","2");
body.add("mid","16");
FormBody body1 = body.build();
Request.Builder builder1 = new Request.Builder();
builder1.url(posturl);
builder1.post(body1);
Request request = builder1.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: "+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body2 = response.body();
String json = body2.toString();
Message obtain = Message.obtain();
obtain.what=777;
obtain.obj=json;
handler.sendMessage(obtain);
}
});
}
});
四.okhttp完成下载文件
buttonDownload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(1,TimeUnit.MINUTES);
builder.connectTimeout(1,TimeUnit.MINUTES);
OkHttpClient client = builder.build();
Request.Builder builder1 = new Request.Builder();
builder1.get();
builder1.url("http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4");
Request request = builder1.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: "+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
long contentLength = body.contentLength();
Log.d(TAG, "onResponse: "+contentLength);
InputStream inputStream = body.byteStream();
FileOutputStream outputStream = new FileOutputStream("/sdcard/Movies/aa.mp4");
byte[] bytes = new byte[1024];
int len=0;
int count=0;
while((len=inputStream.read(bytes))!=-1){
count+=len;
outputStream.write(bytes,0,len);
long l = (count / contentLength) * 100;
Message obtain = Message.obtain();
obtain.what=666;
obtain.obj=l;
handler.sendMessage(obtain);
}
}
});
}
});
五.okhttp完成上传文件
buttonUploading.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(1,TimeUnit.MINUTES)
.readTimeout(1,TimeUnit.MINUTES)
.build();
MultipartBody file = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "zhoujiayin.mp3",
RequestBody.create(MediaType.parse("media/mp3"), new File("/sdcard/Music/HIDDN,Beatrich - Find You.mp3")))
.build();
Request request = new Request.Builder()
.url("http:/169.254.113.244/hfs/")
.post(file)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: "+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
});
联系人多布局
适配器
public class MyBaseAdapter extends BaseAdapter {
private List<Phone>list;
Context context;
public MyBaseAdapter(List<Phone> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
TitleHolder titleHolder = new TitleHolder();
PersonHolder personHolder = new PersonHolder();
if (view==null){
if (getItemViewType(i)==Phone.TITLE){
view = LayoutInflater.from(context).inflate(R.layout.layout,null);
titleHolder.title = view.findViewById(R.id.textview_title);
view.setTag(titleHolder);
}else{
view = LayoutInflater.from(context).inflate(R.layout.layout2,null);
personHolder.name = view.findViewById(R.id.textview_name);
personHolder.number = view.findViewById(R.id.textview_number);
view.setTag(personHolder);
}
}else{
if (getItemViewType(i)==Phone.TITLE){
titleHolder = (TitleHolder)view.getTag();
}else{
personHolder = (PersonHolder) view.getTag();
}
}
if (getItemViewType(i)==Phone.TITLE){
titleHolder.title.setText(list.get(i).getTitle_()+"");
}else{
personHolder.name.setText(list.get(i).getName()+"");
personHolder.number.setText(list.get(i).getNumber()+"");
}
return view;
}
class TitleHolder{
TextView title;
}
class PersonHolder{
TextView name;
TextView number;
}
Bean类
public class Phone {
public static final int TITLE=0;
public static final int PERSON=1;
private String name;
private String number;
private String title;
private int type;
public Phone() {
}
public Phone(String name, String number, String title, int type) {
this.name = name;
this.number = number;
this.title = title;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getTitle_() {
return title;
}
public void setTitle_(String title_) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String toString() {
return "Phone{" +
"name='" + name + '\'' +
", number='" + number + '\'' +
", title_='" + title + '\'' +
", type=" + type +
'}';
}
获取联系人
这是Fragment里读取联系人
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.fragment_second, container, false);
ListView listview = inflate.findViewById(R.id.lv);
initDate();
MyBaseAdapter myBaseAdapter = new MyBaseAdapter(list, getContext());
listview.setAdapter(myBaseAdapter);
// Inflate the layout for this fragment
return inflate;
}
private void initDate() {
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
ContentResolver contentResolver = getContext().getContentResolver();
Cursor cursor = contentResolver.query(uri, null, null, null, "phonebook_label");
if (cursor != null) {
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String title = cursor.getString(cursor.getColumnIndex("phonebook_label"));
if (title.equals(title_)){
list.add(new Phone(name,number,title,Phone.PERSON));
}else{
list.add(new Phone(name,number,title,Phone.PERSON));
list.add(new Phone(name,number,title,Phone.TITLE));
title_=title;
}
}
}
}
XML布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Fragment.SecondFragment"
android:orientation="vertical">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv"></ListView>
</LinearLayout>
多布局文件
1.第一个布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="#C0C0C0"
android:id="@+id/textview_title"></TextView>
</LinearLayout>
2.第二个布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:id="@+id/textview_name"></TextView>
<TextView
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="3"
android:id="@+id/textview_number"></TextView>
</LinearLayout>