===============原生http=====================
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et;
private String thtmlStr;
private TextView tv;
private ImageView imav;
protected final int REQUESTSUCCESS=0;//常量
protected final int REQUESTFAILure=1;
// 在主线程定义一个Handler,用来法消息和处理消息,Looper的作用是监听消息队列,去消息队列取消息;程序一启动就会创建一个主线程,同时就有了一个Looper循环
// @SuppressLint("HandlerLeak")
// private Handler handler = new Handler(){
// //实现handler的方法,这个方法在主线程执行
// public void handleMessage (Message msg){
//
// Log.e("main","main");
//if(msg.what==0) {
tv.setText((String) msg.obj);//只有主线程才能更新UI,网络请求必须在在子线程
// imav.setImageBitmap((Bitmap)msg.obj);
//}else if(msg.what==1){
// Toast.makeText(getApplicationContext(),"服务器正忙",Toast.LENGTH_LONG).show();
//}else{
// imav.setImageBitmap((Bitmap)msg.obj);
//}
//
// }
// };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button surebtn = (Button) findViewById(R.id.sureBtn);
surebtn.setOnClickListener(this);//按钮的点击事件
Log.e("s","11");
et = findViewById(R.id.urlText);
tv=findViewById(R.id.showtext);
imav=findViewById(R.id.look);
}
//网路请求要加权限
@Override
public void onClick(View view) {
Log.e("v","fff");
new Thread(new Runnable()
{
public void run () {
try {
//获取缓存的图片
String path = et.getText().toString().trim();
File file = new File(getCacheDir(), Base64.encodeToString(path.getBytes(),Base64.DEFAULT));
if (file.exists() && file.length() > 0) {
Log.e("f","使用缓存");
Bitmap cacheMap = BitmapFactory.decodeFile(file.getAbsolutePath());
// Message msg = Message.obtain();
// msg.obj = cacheMap;
// handler.sendMessage(msg);
} else {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();//http连接
//post方式***********************
conn.setRequestMethod("POST");
conn.setReadTimeout(5000);
conn.setRequestProperty("ext/plain, text/html","application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length",path.length()+"");
conn.setDoOutput(true);//标记,允许输出
conn.getOutputStream().write(path.getBytes());//以流的形式吧数据写给服务器
//get方式****************************
URL url = new URL(path);//创建url
conn.setRequestMethod("GET");//必须大写,默认是GET
conn.setConnectTimeout(15000);//设置超时时间
int code = conn.getResponseCode();//获取状态码
if (code == 200) {//请求成功
InputStream in = conn.getInputStream();//获取服务器返回的数据。流的处理抽取成一个工具类Utils
// thtmlStr = StreamTools.reamStream(in);
// Message msg = new Message();
// msg.what=REQUESTSUCCESS;
// msg.obj = thtmlStr;
// Log.e("msg", (String) msg.obj);
// handler.sendMessage(msg);//发送消息,在主线程handler中接收
//****************缓存图片************
FileOutputStream fos = new FileOutputStream(file);
int len = -1;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
in.close();
//**************handler发消息更新UI**************************
// Message msg = Message.obtain();
// msg.what = REQUESTSUCCESS;
// Bitmap bm = BitmapFactory.decodeStream(in);//吧流转换成位图;,如果in没有关闭流使用这个方法
final Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
// msg.obj = bm;
// handler.sendMessage(msg);
//***************runOnUiThread更新UI****************如果只是更新ui,则使用runOnUiThread,如果要携带数据,就用handler;
runOnUiThread(new Runnable() {
@Override
public void run() {
//不管在主线程还是子线程都会执行
imav.setImageBitmap(bm);
}
});
} else {
// Message msg = new Message();
// msg.what = REQUESTFAILure;
// handler.sendMessage(msg);//发送消息,在主线程handler中接收
}
}
} catch(MalformedURLException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
}}) .start();
}
}
----------读取stream流的工具类---------
/** * Created by wofu on 2018/3/27. * stream的工具类 */ public class StreamTools extends Object { //吧inputstream转换成String public static String reamStream (InputStream in) throws IOException { //定义一个内存输出流 ByteArrayOutputStream out=new ByteArrayOutputStream(); int len=-1; byte[] buffer= new byte[1024]; if((len=in.read(buffer))!=-1){ out.write(buffer,0,len);// } String content=new String(out.toByteArray()); return content; } }
============Volley=============
=============Retrofit==========
========OkHttp===========
OKHttp Github地址:----https://github.com/square/okhttp
导入okhttp中遇到的问题:1,可能重复导入---解决:在file-》project Structure-->app-->dependencies;吧okhttp删掉;
okhttp使用:https://blog.csdn.net/fightingXia/article/details/70947701
https://blog.csdn.net/s13383754499/article/details/78978025
https://www.jianshu.com/p/f5320b1e0287
问题:response.body().string()只能调用一次分析
使用:
在清单文件中添加权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
在app模块中的build. graidle 中
dependencies {
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
}
*********OKHttp中设置请求头特别简单,在创建request对象时调用一个方法即可。
Request request = new Request.Builder().url("http://www.baidu.com").header("User-Agent", "OkHttp Headers.java").addHeader("token", "myToken").build();
1.同步:get
//get同步请求---http://ddb.cn/api/VlianbaoCash/deposit
public void gettongbuDatasync(){
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
Request request = new Request.Builder()
.url(String.valueOf(test.getText()))//请求接口。如果需要传参拼接到接口后面。
.build();//创建Request 对象
Response response = null;
try {
response = client.newCall(request).execute();//得到Response 对象
Log.e("kwwl","get同步res=="+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
//get异步请求
private void getyibuDataAsync() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(String.valueOf(test.getText()))
.build();//创建request对象
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//请求失败的回调
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
if (response.isSuccessful()) {//回调的方法执行在子线程。
Log.d("kwwl", "get异步获取数据成功了");
Log.d("kwwl", "get异步response.code()==" + response.code());
Log.d("kwwl", "get异步response.body().string()==" + response.body().string());
}
}
});
}
}).start();
}
//post同步
//post异步
private void postyibuDataWithParame() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("username","zhangsan");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url(String.valueOf(test.getText()))
.post(formBody.build())//传递请求体
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","post异步获取数据成功了");
Log.d("kwwl","post异步response.code()=="+response.code());
Log.d("kwwl","post异步response.body().string()=="+response.body().string());
}
}
});
}
}).start();
}
// 使用FormBody传递键值对参数,用来上传String类型的键值对 ,post方法接收的参数是RequestBody 对象,所以只要是RequestBody 类以及子类对象都可以当作参数进行传递。FormBody就是RequestBody 的一个子类对象。
private void postyibuFormBodyDataWithParame() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("username","zhangsan");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url("http://www.baidu.com")
.post(formBody.build())//传递请求体
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","post异步获取数据成功了");
Log.d("kwwl","post异步response.code()=="+response.code());
Log.d("kwwl","post异步response.body().string()=="+response.body().string());
}
}
});
}
}).start();
}
// 使用RequestBody传递Json,RequestBody是抽象类,故不能直接使用,但是他有静态方法create,使用这个方法可以得到RequestBody对象。这种方式可以上传Json对象或File对象。
private void postyibuFileDataWithParame() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据.
RequestBody body = RequestBody.create(JSON, jsonStr);
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","post异步获取数据成功了");
Log.d("kwwl","post异步response.code()=="+response.code());
Log.d("kwwl","post异步response.body().string()=="+response.body().string());
}
}
});
}
}).start();
}
// 使用RequestBody传递File对象,
private void postyibuJsonDataWithParame() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
MediaType fileType = MediaType.parse("File/*");//数据类型为json格式,
File file = new File("path");//file对象.
RequestBody body = RequestBody.create(fileType , file );
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","post异步获取数据成功了");
Log.d("kwwl","post异步response.code()=="+response.code());
Log.d("kwwl","post异步response.body().string()=="+response.body().string());
}
}
});
}
}).start();
}
// 使用MultipartBody同时传递键值对参数和File对象,FromBody传递的是字符串型的键值对,RequestBody传递的是多媒体,那么如果我们想二者都传递怎么办?此时就需要使用MultipartBody类。
private void postyibuFileAndJsonDataWithParame() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
File file=new File("路径名");
MultipartBody multipartBody =new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("groupId","idone")//添加键值对参数
.addFormDataPart("title","title")
.addFormDataPart("file","文件名",RequestBody.create(MediaType.parse("file/*"), file))//添加文件
.build();
final Request request = new Request.Builder()
.url("http://")
.post(multipartBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","post异步获取数据成功了");
Log.d("kwwl","post异步response.code()=="+response.code());
Log.d("kwwl","post异步response.body().string()=="+response.body().string());
}
}
});
}
}).start();
}
//自定义RequestBody实现流的上传,只要是RequestBody类以及子类都可以作为post方法的参数,下面我们就自定义一个类,继承RequestBody,实现流的上传。
private void postyibuAudefineRequestBodyDataWithParame() {
RequestBody body = new RequestBody() {
@Override
public MediaType contentType() {
return null;
}
@Override
public void writeTo(BufferedSink sink) throws IOException {//重写writeTo方法
FileInputStream fio= new FileInputStream(new File("fileName"));
byte[] buffer = new byte[1024*8];
if(fio.read(buffer) != -1){
sink.write(buffer);
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","post异步获取数据成功了");
Log.d("kwwl","post异步response.code()=="+response.code());
Log.d("kwwl","post异步response.body().string()=="+response.body().string());
}
}
});
}
}).start();
}
// //下载, 在OKHttp中并没有提供下载文件的功能,但是在Response中可以获取流对象,有了流对象我们就可以自己实现文件的下载。代码如下:这段代码写在回调接口CallBack的onResponse方法中:
// public void download() {
//
//
// try {
// InputStream is = response.body().byteStream();//从服务器得到输入流对象
// long sum = 0;
// File dir = new File(mDestFileDir);
// if (!dir.exists()) {
// dir.mkdirs();
// }
// File file = new File(dir, mdestFileName);//根据目录和文件名得到file对象
// FileOutputStream fos = new FileOutputStream(file);
// byte[] buf = new byte[1024 * 8];
// int len = 0;
// while ((len = is.read(buf)) != -1) {
// fos.write(buf, 0, len);
// }
// fos.flush();
//
// }
// }
=======afinal中的FinalHttp===========
OKHttp中设置请求头特别简单,在创建request对象时调用一个方法即可。
Request request = new Request.Builder() .url("http://www.baidu.com") .header("User-Agent", "OkHttp Headers.java") .addHeader("token", "myToken") .build();