Okhttp
okhttp是一个第三方类库,用于android中请求网络。
这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient)。
1.同步get请求:开启子线程
2.同步post请求:开启子线程
3.异步get请求:不需要开启子线程
4.异步post请求:不需要开启子线程
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button android:layout_width="match_parent"
android:text="GET"
android:id="@+id/bt_1"
android:layout_height="50dp"/>
<Button android:layout_width="match_parent"
android:id="@+id/bt_2"
android:text="POST"
android:layout_height="50dp"/>
<Button android:layout_width="match_parent"
android:text="DOWNLOAD"
android:id="@+id/bt_3"
android:layout_height="50dp"/>
<SeekBar android:layout_width="match_parent"
android:id="@+id/seek"
android:layout_height="50dp"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
Button button1,button2,button3;
SeekBar seekBar;
String get_url="http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1";
String post_url="https://www.apiopen.top/createUser?key=00d91e8e0cca2b76f515926a36db68f5";
String downlaod_url="http://uvideo.spriteapp.cn/video/2019/0719/cc6b8cea-a97a-11e9-a3f8-90b11c479401_wpd.mp4";
@SuppressLint("HandlerLeak")
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==101){
Toast.makeText(MainActivity.this, ""+msg.obj.toString(), Toast.LENGTH_SHORT).show();
}else if (msg.what==102){
Toast.makeText(MainActivity.this, ""+msg.obj.toString(), Toast.LENGTH_SHORT).show();
}else if (msg.what==103){
Toast.makeText(MainActivity.this, ""+msg.obj.toString(), Toast.LENGTH_SHORT).show();
}else if (msg.what==104){
Toast.makeText(MainActivity.this, ""+msg.obj.toString(), Toast.LENGTH_SHORT).show();
}else if (msg.what==105){
Toast.makeText(MainActivity.this, ""+msg.obj.toString(), Toast.LENGTH_SHORT).show();
}else if (msg.what==106){
Toast.makeText(MainActivity.this, ""+msg.obj.toString(), Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1=findViewById(R.id.bt_1);
button2=findViewById(R.id.bt_2);
button3=findViewById(R.id.bt_3);
seekBar=findViewById(R.id.seek);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkUtils.getInstance().doGet(get_url, new MycallBack() {
@Override
public void success(String result) {
Message message = Message.obtain();
message.what=101;
message.obj=result;
handler.sendMessage(message);
}
@Override
public void fail(String message) {
Message message1 = Message.obtain();
message1.what=102;
message1.obj=message;
handler.sendMessage(message1);
}
});
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HashMap<String,String> map=new HashMap<>();
//phone=13594347817&passwd=123654
map.put("phone","15313873723");
map.put("passwd","123456");
OkUtils.getInstance().doPost(post_url, map, new MycallBack() {
@Override
public void success(String result) {
Message message = Message.obtain();
message.what=103;
message.obj=result;
handler.sendMessage(message);
}
@Override
public void fail(String message) {
Message message1 = Message.obtain();
message1.what=104;
message1.obj=message;
handler.sendMessage(message1);
}
});
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
OkUtils.getInstance().downloadFile(downlaod_url, "/sdcard/Download/okhttp.mp4", new MyFileCallBack() {
@Override
public void success(String result) {
Message message1 = Message.obtain();
message1.what=105;
message1.obj=result;
handler.sendMessage(message1);
}
@Override
public void fail(String message) {
Message message1 = Message.obtain();
message1.what=106;
message1.obj=message;
handler.sendMessage(message1);
}
@Override
public void setMax(long max) {
Log.e("###",max+"");
seekBar.setMax((int) max);
}
@Override
public void setProgress(int progress) {
Log.e("###",progress+"");
seekBar.setProgress(progress);
}
});
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
}
}
//工具类
public class OkUtils {
private OkHttpClient client;
private OkUtils(){
OkHttpClient.Builder builder=new OkHttpClient.Builder();
builder.connectTimeout(5, TimeUnit.SECONDS);
builder.readTimeout(5,TimeUnit.SECONDS);
client= builder.build();
}
private static OkUtils okUtils;
public static OkUtils getInstance(){
if (okUtils==null){
synchronized (String.class){
if (okUtils==null){
okUtils=new OkUtils();
}
}
}
return okUtils;
}
public void doGet(String url, final MycallBack mycallBack){
Request.Builder builder=new Request.Builder();
builder.url(url);
Request request = builder.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
mycallBack.fail(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
mycallBack.fail(response.body().string());
}
});
}
public void doPost(String url, HashMap<String,String> map, final MycallBack mycallBack){
Request.Builder builder=new Request.Builder();
FormBody.Builder builder1=new FormBody.Builder();
Set<String> strings = map.keySet();
for (String s : strings) {
String s1 = map.get(s);
builder1.add(s,s1);
}
FormBody formBody = builder1.build();
builder.post(formBody);
builder.url(url);
Request request = builder.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
mycallBack.fail(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
mycallBack.fail(response.body().string());
}
});
}
public void downloadFile(String url, String filepath, final MyFileCallBack myFileCallBack) throws FileNotFoundException {
final FileOutputStream fos=new FileOutputStream(filepath);
Request.Builder builder=new Request.Builder();
builder.url(url);
Request request = builder.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
myFileCallBack.fail(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
long max = response.body().contentLength();
myFileCallBack.setMax(max);
InputStream inputStream = response.body().byteStream();
int len=0;
byte[] bytes=new byte[1024];
int count=0;
while ((len=inputStream.read(bytes))!=-1){
count+=len;
fos.write(bytes,0,len);
myFileCallBack.setProgress(count);
}
myFileCallBack.success("下载完成");
}
});
}
}
//接口回调
public interface MycallBack {
public void success(String result);
public void fail(String message);
}
public interface MyFileCallBack {
public void success(String result);
public void fail(String message);
public void setMax(long max);
public void setProgress(int progress);
}