技术标签: android 基础
一.引入依赖
implementation 'com.squareup.retrofit2:retrofit:2.7.1'
implementation 'com.squareup.retrofit2:converter-gson:2.7.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
public interface API {
// get方法 Call<实体类> 接口名
@GET("get/text")
Call<JsonResultBean> getJson();
// 带参数的,如果是参数少可以用@Query("参数名") String 参数值
@GET("/get/param")
Call<GetWithParamsBean> getWithParams(@Query("keyword") String keyword,
@Query("page") int page,
@Query("order") String order);
// 如果参数多可以用QueryMap
@GET("/get/param")
Call<GetWithParamsBean> getWithParams(@QueryMap Map<String,Object> params);
// post
@POST("/post/string")
Call<PostWithParamsBean> postWithParams(@Query("string") String content);
// post
@POST
Call<PostWithParamsBean> postWithUrl(@Url String url);
// postJsonObject 传递对象 PostWithJsonObjectBean
@POST("/post/comment")
Call<PostWithJsonObjectBean> postJsonObjet(@Body CommentItemBean itemBean);
// 上传文件,文件可以包括 图片 、 视频、音频 @Part注解,要跟@Multipart注解一起使用
@Multipart
@POST("/api/AppAniImgType/UploadToAliyun")
Call<FileUploadResult> postFile(@HeaderMap Map<String,Object> headers,@Part MultipartBody.Part file);
}
##新建一个单例功我们所有页面使用的网络请求-包含我们的baseUrl
public class RetrofitManager {
// 我们的baseUrl
public static String BASE_URL="http://xxxxx/";
//设置超时时间
public static final int CONNECT_TIME_OUT = 100000;
private static RetrofitManager sRetrofitManager = null;
private Retrofit mRetrofit;
private RetrofitManager() {
createRetrofit();
}
private void createRetrofit() {
//设置一下okHttp的参数
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIME_OUT, TimeUnit.MILLISECONDS)
.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())// 转换器直接转换成了bean类
.build();
}
public static RetrofitManager getInstance() {
if (sRetrofitManager == null) {
synchronized (RetrofitManager.class) {
if (sRetrofitManager == null) {
sRetrofitManager = new RetrofitManager();
}
}
}
return sRetrofitManager;
}
public Retrofit getRetrofit() {
return mRetrofit;
}
}
##二. 在我们的页面中使用
private API mApi;
在onCreate()方法中调用
mApi = RetrofitManager.getInstance().getRetrofit().create(API.class);
/*
* get方法请求网路
* */
public void getClickRequest(View view) {
Call<JsonResultBean> task = mApi.getJson();
task.enqueue(new Callback<JsonResultBean>() {
@Override
public void onResponse(Call<JsonResultBean> call, Response<JsonResultBean> response) {
Log.i(TAG, "onResponse:----> " + response.code());
if (response.code() == HttpURLConnection.HTTP_OK) {
JsonResultBean resultBean = response.body();
updateList(resultBean);
}
}
@Override
public void onFailure(Call<JsonResultBean> call, Throwable t) {
Log.i(TAG, "onFailure: ---->" + t.toString());
}
});
}
/**
* 带参数的请求
*/
public void getClickParams(View view) {
Call<GetWithParamsBean> task = mApi.getWithParams("大家好", 10, "10");
task.enqueue(new Callback<GetWithParamsBean>() {
@Override
public void onResponse(Call<GetWithParamsBean> call, Response<GetWithParamsBean> response) {
int code = response.code();
Log.i(TAG, "onResponse:----> " + code);
if (response.code() == HttpURLConnection.HTTP_OK) {
Log.i(TAG, "onResponse:---->" + response.body());
}
}
@Override
public void onFailure(Call<GetWithParamsBean> call, Throwable t) {
Log.i(TAG, "onFailure: ---->" + t.toString());
}
});
}
/**
* 带参数的用QueryMap
*/
public void getClickParamsQueryMap(View view) {
Map<String, Object> params = new HashMap<>();
params.put("keyword", "搜索关键字");
params.put("page", 10);
params.put("order", "0");
Call<GetWithParamsBean> task = mApi.getWithParams(params);
task.enqueue(new Callback<GetWithParamsBean>() {
@Override
public void onResponse(Call<GetWithParamsBean> call, Response<GetWithParamsBean> response) {
int code = response.code();
Log.i(TAG, "onResponse:----> " + code);
if (response.code() == HttpURLConnection.HTTP_OK) {
Log.i(TAG, "onResponse:---->" + response.body());
}
}
@Override
public void onFailure(Call<GetWithParamsBean> call, Throwable t) {
Log.i(TAG, "onFailure: ---->" + t.toString());
}
});
}
/**
* 带参数的用QueryMap
*/
public void getClickParamsQueryMap(View view) {
Map<String, Object> params = new HashMap<>();
params.put("keyword", "搜索关键字");
params.put("page", 10);
params.put("order", "0");
Call<GetWithParamsBean> task = mApi.getWithParams(params);
task.enqueue(new Callback<GetWithParamsBean>() {
@Override
public void onResponse(Call<GetWithParamsBean> call, Response<GetWithParamsBean> response) {
int code = response.code();
Log.i(TAG, "onResponse:----> " + code);
if (response.code() == HttpURLConnection.HTTP_OK) {
Log.i(TAG, "onResponse:---->" + response.body());
}
}
@Override
public void onFailure(Call<GetWithParamsBean> call, Throwable t) {
Log.i(TAG, "onFailure: ---->" + t.toString());
}
});
}
/*
* post请求,body携带字符串内容(json)
* */
public void postJsonObject(View view) {
CommentItemBean itemBean = new CommentItemBean();
itemBean.setArticleId("123456");
itemBean.setCommentContent("这是我提交测试的评论内容...");
// PostWithJsonObjectBean 也可以通过对象形式拿返回值
Call<PostWithJsonObjectBean> task = mApi.postJsonObjet(itemBean);
task.enqueue(new Callback<PostWithJsonObjectBean>() {
@Override
public void onResponse(Call<PostWithJsonObjectBean> call, Response<PostWithJsonObjectBean> response) {
int code = response.code();
Log.i(TAG, "onResponse:----> " + code);
if (code == HttpURLConnection.HTTP_OK) {
Log.i(TAG, "onResponse:---->" + response.body());
}
}
@Override
public void onFailure(Call<PostWithJsonObjectBean> call, Throwable t) {
Log.i(TAG, "onFailure: ---->" + t.toString());
}
});
}
/*
* 拦截器的使用
* */
public void postJsonObject2(View view) {
CommentItemBean itemBean = new CommentItemBean();
itemBean.setArticleId("123456");
itemBean.setCommentContent("这是我提交测试...");
OkHttpClient.Builder okhttpClient = new OkHttpClient.Builder();
HttpLoggingInterceptor looger = new HttpLoggingInterceptor();
looger.setLevel(HttpLoggingInterceptor.Level.BODY);
// 只在开发版本中才会记录
if (BuildConfig.DEBUG) {
okhttpClient.addInterceptor(looger);
}
okhttpClient.addInterceptor(looger);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RetrofitManager.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())// 转换器直接转换成了bean类
.client(okhttpClient.build())
.build();
API service = retrofit.create(API.class);
Call<PostWithJsonObjectBean> call = service.postJsonObjet(itemBean);
call.enqueue(new Callback<PostWithJsonObjectBean>() {
@Override
public void onResponse(Call<PostWithJsonObjectBean> call, Response<PostWithJsonObjectBean> response) {
int code = response.code();
Log.i(TAG, "onResponse:----> " + code);
if (code == HttpURLConnection.HTTP_OK) {
Log.i(TAG, "onResponse:---->" + response.body());
}
}
@Override
public void onFailure(Call<PostWithJsonObjectBean> call, Throwable t) {
Log.i(TAG, "onFailure: ---->" + t.toString());
}
});
}
File file = new File("/storage/emulated/0/Download/1.jpg");
if (!file.exists()) {
Toast.makeText(RetrofitActivity.this, "该文件不存在", Toast.LENGTH_SHORT).show();
return;
}
MediaType mediaType = MediaType.parse("image/*");
RequestBody fileBody = RequestBody.create(mediaType, file);
// MultipartBody.Part 和后端约定好Key,这里的partName是用file
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), fileBody);
// 添加描述
// String descriptionString = "hello, 这是文件描述";
// RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
HashMap<String,Object> hashMap = new HashMap<>();
hashMap.put("authToken","08c958df-187f-4e11-973b-3495a8e8e0ae");
hashMap.put("appKey","6f9f7cfd-a92d-45a0-8e4a-d2aa96b84b27");
Call<FileUploadResult> task = mApi.postFile(hashMap,part);
task.enqueue(new Callback<FileUploadResult>() {
@Override
public void onResponse(Call<FileUploadResult> call, Response<FileUploadResult> response) {
int code = response.code();
Log.i(TAG, "onResponse:----> " + code);
if (code == HttpURLConnection.HTTP_OK) {
Log.i(TAG, "onResponse:---->" + response.body());
}
}
@Override
public void onFailure(Call<FileUploadResult> call, Throwable t) {
Log.i(TAG, "onFailure: ---->" + t.toString());
}
});
在SpringBoot 项目中,使用Hutool或者原生POI导出xlsx,工具类随笔
1) 说明:LED灯是发光二级管,反着接电阻无穷大,正着接不需要考虑电阻。一般小的LED灯可通过的最大电流为30mA,如电压为5V,加一个220欧电阻后,电流约22mA左右,则可以保证不烧坏LED。另外,控制明暗需要接Arduino的PWM口(数字前带~的)2) 硬件:四脚三色LED灯,面包板,电阻220欧三只,Arduino uno,杜邦线3)
前言大家应该都知道,在Android中,我们对于View进行模拟点击事件,很容易,比如调用View.performClick即可。但是有些时候,我们想要更加精细的点击,比如View的某一区域或者某一点进行点击。比如下面的例子。上面是一个WebView加载了一个视频,我们必须手动点一下播放按钮才能让视频播放,当然我们想要的最好是如下的自动播放效果(进入界面后,自动播放视频)当然方法有很多,比如通过j...
http://www.cnblogs.com/tintown/category/13064.html
SpringCloud Eureka项目启动子项目报错Connection refused: connect Cannot execute request on any known server
之前项目出现返回时间里面多了一个".0",最开始直接使用split("."),发现不能得到正确的结果。进一步调试发现需要进行转义才行。=.=查找了一下原因,在正则表达示中有使用到的字符,在使用时要进行转义处理。查看了一下正则表达式,来自百度。 元字符 描述 \ 将下一个字符标记符、或一个向后引用、或一个八进制转义符。...
很多面试官在基础考察的时候都是直接是根据书来问,因为这些面试官也是从学生时代过来的,而他们可能和你看的是同一本书。也就是如果你和面试官的知识体系结构一样的话,面试官问出来的问题,你自然可以回答得很好。下面是书籍推荐:#00 推荐 《head first Java》head first系列一直口碑不错,这本书更是适合java入门,先看完这本书,然后看下面的这些。或者看《疯狂java讲义》,两者...
在由CSDN和《程序员》杂志联合举办的第三届中国软件技术英雄会(上海站)上,由主持人CSDN首席分析师孟岩,上海群硕大中华区软件开发总监邵荣,阿里软件技术总监叶伟,盛大游戏首席技术官朱继盛, 趋势科技(中国)有限公司技术总监蔡昇钦,巨人网络集团首席技术官CTO宋仕良,淘宝网首席架构师王文彬共同参与的CTO论坛上,就有关CTO是否必须为技术高手,从程序员到技术高手成长之路,知名互联网公司如何招聘人才...
1948 年,伟大的信息论之父**香农(Shannon)**将热力学中熵的概念引入到了信息论中,提出了“信息熵”这一概念。信息熵用于解决信息的量化问题,将原本模糊的信息概念进行计算得出精确的信息熵值,信息熵是描述消息中,不确定性的值。理解起来需要一点耐心,可以先这么说,信息熵就是用来描述信息中不确定性的值,熵越低,不确定性越低,我们也就更容易得到确定的信息。举个栗子,张三的女朋友小红又要过生日了,他现在挑选礼物有三个选择:口红、包、机械键盘。张三并不知道小红到底喜欢那种礼物,因此对于张三来说,小红喜欢
/** * Tooast相关工具类 */public class ToastUtils { private static final int COLOR_DEFAULT = 0xFEFFFFFF; private static final String NULL = "null"; private static IToast iToast; private static int sGravity = -1; private static int sXOffse
http://www.android.com/wear/
很多人遇到了路由高亮的问题。问为什么页面一刷新进来当前页就不不高。刷新的时候也没有记录状态。其实就是路由没有记录。。。我们想要实现的效果是:1、这里用的是 Element UI 。先把菜单封装。请看上面的文章:https://blog.csdn.net/u013592575/article/details/1034938652、element UI 中 NavMenu 有一个 d...