最后
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
同时我经过多年的收藏目前也算收集到了一套完整的学习资料以及高清详细的Android架构进阶学习导图及笔记分享给大家,希望对想成为架构师的朋友有一定的参考和帮助。
下面是部分资料截图,诚意满满:特别适合有开发经验的Android程序员们学习。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
return Response.error(new ParseError(networkResponse));//返回解析错误
}
}
@Override
protected void deliverResponse(T t) {
this.mListener.onResponse(t);
}
/**
-
@return post 请求的请求体参数
-
@throws AuthFailureError
*/
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return requestBodyMap;
}
/**
- @return 一个简单的单例 Gson对象
*/
private Gson getGson() {
if (mGson == null) {
mGson = new Gson();
}
return mGson;
}
/**
-
将请求加入到请求队列中
-
创建请求对象之后可以直接调用此方法,链式调用方便代码书写
*/
public void execute() {
NetworkManager.addRequest(this);
}
}
请求对象我们有了,还需要一个请求队列,我们把这个请求队列封装在网络管理类中
public class NetworkManager {
//整个app只保留和维护一个Volley请求队列
private static RequestQueue mRequestQueue;
//缓存大小是我们运行内存大小的1/4
private static final int CACHE_SIZE = (int) (Runtime.getRuntime().freeMemory() / 4);
//维护一个全局的ImageLoader
private static ImageLoader mImageLoader;//Helper that handles loading and caching images from remote URLs.
/**
-
在application 的onCreate方法中调用此方法
-
@param context getApplicationContext
*/
public static void init(Context context) {
mRequestQueue = Volley.newRequestQueue(context);
mImageLoader = new ImageLoader(mRequestQueue, new MyImageCache(CACHE_SIZE));
}
/**
- 添加请求到请求队列
*/
public static void addRequest(Request request) {
mRequestQueue.add(request);
}
/**
-
LruCache (Least Recent Use Cache)
-
当缓存空间已经满了,就会把最近最少使用的数据清除掉
-
K 存储数据的键值
-
V 存储的数据
*/
public static class MyImageCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
/**
- @param maxSize 缓存的大小
*/
public MyImageCache(int maxSize) {
super(maxSize);
}
/**
- @return 返回对应数据缓存的大小, 即图片的大小
*/
@Override
protected int sizeOf(String key, Bitmap value) {
//return value.getByteCount(); api 要求比较高 , 故用下面的 , 实质相同
return value.getRowBytes() * value.getHeight();
}
/**
-
从缓存里面获取对应url的图片
-
@param url 缓存的key
*/
@Override
public Bitmap getBitmap(String url) {
return get(url);//从lru cache里面获取图片
}
/**
- 把对应url的图片存进缓存
*/
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
/**
- @return 全局唯一的ImageLoader
*/
public static ImageLoader getImageLoader() {
return mImageLoader;
}
}
在应用的Application中还需要初始化我们的NetWorkManager:
public class QJApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
NetworkManager.init(getApplicationContext());
}
}
如此简单封装之后我们的请求就可以这么写了:
private void performGetRequest() {
String url = “http://192.168.1.9:8080/version.json”;//自己测试的url
Response.Listener listener = new Response.Listener() {
@Override
public void onResponse(VersionBean o) {
Log.d(TAG, "onResponse: " + o);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.d(TAG, "onErrorResponse: " + volleyError.getMessage());
}
};
new QJRequest(VersionBean.class, url, listener, errorListener).execute();//get请求封装后写法示例
}
传入url和成功错误的回调之后我们最后可以得到的是对应json数据的java bean类,这样就方便很多了,post请求亦是如此
private void performPostRequest() {
String url = “http://139.199.76.41:8080/vr-app/game/gameRecommends”;
Map<String, String> map = new HashMap<>();
map.put(“item”, “2”);
Response.Listener listener = new Response.Listener() {
@Override
public void onResponse(GameRecommendsBean o) {
Log.d(TAG, "onResponse: " + o);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.d(TAG, "onErrorResponse: " + volleyError.getMessage());
}
};
new QJRequest(GameRecommendsBean.class, url, map, listener, errorListener).execute();
}
与get请求相比,post请求只是多了一个请求体参数,需要一个Map集合,创建请求之后调用execute()方法直接发送请求,便于代码的书写
对于图片的请求,volley给我提供了一个用于请求网络图片的ImageView,即NetworkImageView,利用我们的简单封装可以很方便的请求图片
mNetworkImageView.setImageUrl(url, NetworkManager.getImageLoader());//使用NetWorkImageView只需要url即可
简单封装到此结束,谢谢阅读!
---------------------------------------------2017/12/22---------------------------------------------
对于上面代码的封装中有几处后来优化的地方做如下说明:
1. 缓存大小的设置(NetworkManager中的init方法)
CACHE_SIZE = (int) (Runtime.getRuntime().maxMemory() >> 3);
if (CACHE_SIZE <= 0) {
CACHE_SIZE = 10240000;//未获取到jvm的大小,则设置为固定值,将近 10M
最后
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
以下是今天给大家分享的一些独家干货:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
以下是今天给大家分享的一些独家干货:
[外链图片转存中…(img-Z1k3wyqx-1715897072102)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!