高仿糗事百科,是一个典型的cs模式,所以我们获取数据就要通过net,今天我就开始书写关于网络连接方面的书写。
在安卓中,我们将联网请求往往是放在次线程中,如果放在主线程中,将会导致主线程要处理事件太多导致崩溃,而放在次线程中,那么将出现管理线程的问题,于是我们就可以使用一个线程池辅助类ThreadPoolUtils

/*** 线程池辅助类,整个应用程序就只有一个线程池去管理线程。* 可以设置核心线程数、最大线程数、额外线程空状态生存时间,阻塞队列长度来优化线程池*/
public class ThreadPoolUtils {private ThreadPoolUtils() {}// 定义核心线程数,并行线程数private static int CORE_POOL_SIZE = 3;// 线程池最大线程数:除了正在运行的线程额外保存多少个线程private static int MAX_POOL_SIZE = 200;// 额外线程空闲状态生存时间private static int KEEP_ALIVE_TIME = 5000;// 阻塞队列。当核心线程队列满了放入的// 初始化一个大小为10的泛型为Runnable的队列private static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(10);// 线程工厂,把传递进来的runnable对象生成一个Threadprivate static ThreadFactory threadFactory = new ThreadFactory() {// 原子型的integer变量生成的integer值不会重复private final AtomicInteger ineger = new AtomicInteger();@Overridepublic Thread newThread(Runnable arg0) {return new Thread(arg0, "MyThreadPool thread:"+ ineger.getAndIncrement());}};// 当线程池发生异常的时候回调进入private static RejectedExecutionHandler handler = new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 进行重启操作}};// 线程池ThreadPoolExecutor java自带的线程池private static ThreadPoolExecutor threadpool;// 静态代码块,在类被加载的时候进入static {threadpool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE,KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, threadFactory,handler);}public static void execute(Runnable runnable) {threadpool.execute(runnable);}
}

有了ThreadPoolUtils我们就可以管理线程
下面开始书写第一个关于网络get请求的请求线程:

public class HttpGetThread implements Runnable {private Handler hand;private String url;private MyGet myGet=new MyGet();public HttpGetThread(Handler hand, String endParamerse) {this.hand = hand;// 拼接访问服务器完整的地址url = Model.HTTPURL + endParamerse;}@Overridepublic void run() {// 获取我们回调主ui的messageMessage msg = hand.obtainMessage();msg = hand.obtainMessage();Log.e("liuxiaowei", url);try {String result = myGet.doGet(url);msg.what = 200;msg.obj = result;} catch (ClientProtocolException e) {msg.what = 404;} catch (IOException e) {msg.what = 100;}hand.sendMessage(msg);}
}

在这个线程中我们主要做了两件事:
一个是通过String result = myGet.doGet(url);这段代码在NET工具类中通过url获取所需要的数据
第二件事是通过handler的message将下载进程与主ui进程进行交互用来更新ui中的数据.

下面就进入myGet工具类:

public String doGet(String url) throws ClientProtocolException, IOException {String result = null;// 我们的网络交互返回值HttpGet myGet = new HttpGet(url);//網絡請求urlHttpClient httpClient = new DefaultHttpClient();httpClient.getParams().setIntParameter(//设置连接超时HttpConnectionParams.CONNECTION_TIMEOUT, 5 * 1000);//设置socket连接超时httpClient.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,30 * 1000);HttpResponse httpResponse = httpClient.execute(myGet);if (httpResponse.getStatusLine().getStatusCode() == 200) {result = EntityUtils.toString(httpResponse.getEntity(), "utf-8");}return result;}

通过调用MyGet工具类获取服务器中的信息,其中谷歌公司对HttpGet进行了屏蔽,我们需要去apache官网去下载httpcilent和httpcore两个jar包进行方法的导入
有了以上的下载线程已经get获取工具,我们还需要在Fragment中进行进程的启动,在HotFragment中我们是在createListModel()方法中进行数据的加载,根据干货、嫩草、文字我们进行url的切换从而访问不同的数据,最后 ThreadPoolUtils.execute(new HttpGetThread(hand, url));通过进程管理工具进行网络进程的使用,其中的hand正是主ui线程的handler.

在handler中我们通过对msg传输的值进行判断是否传输成功,并且通过json解析器进行解析,将消息存进AshamedInfo list中最后通过Adapter的notifychanged通知listView进行数据的更新

上面我们将数据传输写完了,下面我们做图片加载的书写:

/*** 控制图片的加载类* 列表在滑动过程时,没有图片会进行下载,并保存到sdcard与 imageCaches 当中去,使用软引用进行封装,如果内存不够时* 我们的imageCaches 当中的Bitmap对象会被清理掉,图片被释放掉 再次需要加载的时候,先从1级缓存当中获取,如果没有的话,去* 本地获取,本地也获取不到的话,去网络下载。 一级缓存作用:对于listview当中刚刚滑动过的item显示的图片进行保存* 二级缓存作用:对于listview当中很久前查看的图片或已经被释放掉图片 进行保存*/
public class LoadImage {//下载图片最大并行线程数private static int MAX = 5;//图片的一级缓存private Map<String, SoftReference<Bitmap>> imageCaches = null;// 查看本地缓存工具类private FileUtiles fileUtiles;// android 提供给我们的一个线程池,使用方便private ExecutorService threadPools = null;// 初始化上面的相关的变量public LoadImage(Context ctx) {imageCaches = new HashMap<String, SoftReference<Bitmap>>();fileUtiles = new FileUtiles(ctx);}// 加载图片时,入口public Bitmap loadImage(final ImageView imageView, final String imageUrl,final ImageDownloadCallBack imageDownloadCallBack) {// imageUrl 由于其唯一型,把他作为我们map当中的key// 获取图片名称final String filename = imageUrl.substring(imageUrl.lastIndexOf("/") + 1, imageUrl.length());// 图片保存到本地时的地址String filepath = fileUtiles.getAbsolutePath() + "/" + filename;// 查找一级缓存,看看是否有这张图片// 如果map当中有这个key返回一个trueif (imageCaches.containsKey(imageUrl)) {// 找到对应图片软引用的封装SoftReference<Bitmap> soft = imageCaches.get(imageUrl);// 从软引用当中获取图片Bitmap bit = soft.get();if (bit != null)return bit;// 从我们的一级缓存(程序内部获取图片)}//从二级缓存中获取图片if (fileUtiles.isBitmap(filename)) {Bitmap bit = BitmapFactory.decodeFile(filepath);// 在二级缓存读取的时候直接添加到一级缓存当中imageCaches.put(imageUrl, new SoftReference<Bitmap>(bit));return bit;}// 一级缓存,二级缓存都不存在,直接到网络加载if (imageUrl != null && !imageUrl.equals("")) {if (threadPools == null) {// 实例化我们的线程池threadPools = Executors.newFixedThreadPool(MAX);}// 下载回图片回调Handlerfinal Handler hand = new Handler() {@Overridepublic void handleMessage(Message msg) {// 如果图片下载成功,并且回调对象不为空时if (msg.what == 111 && imageDownloadCallBack != null) {Bitmap bit = (Bitmap) msg.obj;// 调用回调自定义适配器的接口方法传递数据imageDownloadCallBack.onImageDownload(imageView, bit);}super.handleMessage(msg);}};// 下载图片线程Thread thread = new Thread() {Bitmap bit = null;public void run() {// 网络下载时的字节流InputStream inputStream = DownBitmap.getInstance().getInputStream(imageUrl);//图片压缩到原来一般BitmapFactory.Options op=new BitmapFactory.Options();op.inSampleSize=6;if(Model.IMGFLAG)op.inSampleSize = 1;Bitmap bit = BitmapFactory.decodeStream(inputStream, null,op);if (bit != null) {// 添加到一级缓存当中imageCaches.put(imageUrl,new SoftReference<Bitmap>(bit));// 添加到二级缓存fileUtiles.saveBitmap(filename, bit);// 传递给HandlerMessage msg = hand.obtainMessage();msg.what = 111;msg.obj = bit;hand.sendMessage(msg);}}};threadPools.execute(thread);}return null;}// 通过回调机制设置图片时的接口(类似于Button的Onclick)public interface ImageDownloadCallBack {// ImageView 你所想要设定的imageview Bitmap 想要设定的图片void onImageDownload(ImageView imageView, Bitmap bitmap);}

从内存和本地加载都十分的容易理解,但是在下载中却出现了一个回调我们可以着重观察下

 // 下载回图片回调Handlerfinal Handler hand = new Handler() {@Overridepublic void handleMessage(Message msg) {// 如果图片下载成功,并且回调对象不为空时if (msg.what == 111 && imageDownloadCallBack != null) {Bitmap bit = (Bitmap) msg.obj;// 调用回调自定义适配器的接口方法传递数据imageDownloadCallBack.onImageDownload(imageView, bit);}super.handleMessage(msg);}};// 下载图片线程Thread thread = new Thread() {Bitmap bit = null;public void run() {// 网络下载时的字节流InputStream inputStream = DownBitmap.getInstance().getInputStream(imageUrl);//图片压缩到原来一般BitmapFactory.Options op=new BitmapFactory.Options();op.inSampleSize=6;if(Model.IMGFLAG)op.inSampleSize = 1;Bitmap bit = BitmapFactory.decodeStream(inputStream, null,op);if (bit != null) {// 添加到一级缓存当中imageCaches.put(imageUrl,new SoftReference<Bitmap>(bit));// 添加到二级缓存fileUtiles.saveBitmap(filename, bit);// 传递给HandlerMessage msg = hand.obtainMessage();msg.what = 111;msg.obj = bit;hand.sendMessage(msg);}}};threadPools.execute(thread);}

首先定义的handler,通过这个handler我们可以与下载图片线程进行交互从而获取图片,然后通过回调接口,将图片传入到listViewadapter中进行图片的加载。在下载线程中我们通过DownBitmap获取了图片的输入流再通过图片工厂进行图片的绘制。
下面将DownBitmap进行书写:

/*** 下载服务器网络图片* */
public class DownBitmap {private DownBitmap() {}//单例设计模式private static DownBitmap my=null;public static synchronized DownBitmap getInstance() {if (my == null)my = new DownBitmap();return my;}// 获取网络图片下载时返回的流public InputStream getInputStream(String Biturl){//使用Get获取图片资源HttpGet get=new HttpGet(Biturl);HttpParams httpParams = new BasicHttpParams();//连接超时时间HttpConnectionParams.setConnectionTimeout(httpParams, 5 * 1000);//设置socket超时时间HttpConnectionParams.setSoTimeout(httpParams, 30 * 1000);HttpClient httpClient = new DefaultHttpClient(httpParams);try {HttpResponse hr = httpClient.execute(get);if (hr.getStatusLine().getStatusCode() == 200) {return hr.getEntity().getContent();// 得到服务器返回的输入流}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 建立response连接从而方便获取状态吗return null;}
}

因为获取图片的数据流只需要这一个类,因此我们可以通过单例模式只存在一个DownBitmap 类通过传入不同的url就可以获取不同的图片资源。

高仿糗事百科学习(三)NET相关推荐

  1. 糗事百科 android源码,Android高仿糗事百科(含服务端)

    Android高仿糗事百科(含服务端) 积分: 23 智慧币 积分: 3 智慧币 [1.00元 ] 包含内容: 源码,全套工具 详情描述 如遇视频不清晰,请最大化观看演示 以下仅列出部分功能,全部功能 ...

  2. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·008【首页开发】

    注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [024]page-json配置 [025]图文.视 ...

  3. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·000【前言】

    前言 本系列笔记,基于曾经的网易云课堂上一个"uni-app仿糗事百科"开发的课程,课程的资源来自网络. 我仅做一些笔记,来记录学习的一些收获. 前8节课讲的都是一些软件的基础使用 ...

  4. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·006【底部导航开发】

    注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [013]底部导航开发 [013]底部导航开发 官方 ...

  5. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·005【设置全局属性globalStyle】

    注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [012]设置全局样式globestyle [012 ...

  6. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·009【搜索页开发】

    注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [035]搜索页开发(上) 开发内容 具体方法 核心 ...

  7. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·007【uni-app和vue.js基础快速上手】

    注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [014]view和text组件和动画使用 常见的尺 ...

  8. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·004【App.vue引入全局公共样式】

    注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [009]引入官方CSS样式库 [010]引入第三方 ...

  9. 高仿糗事百科,完整版项目源码,带服务器部分

    源码作者声明:本源码只用于个人研究使用,不可用于商业用途,由于本源码引起的纠纷皆与作者无关. 本项目是本人在学校的时候准备出来实习的时候做的,由于代码有些粗糙迟迟没有发出来. 但今天无意间看到有人把源 ...

最新文章

  1. “数据库审计”关键词,重回Google第一位置
  2. java redis自增操作_【转载】关于spring boot使用redis的increment()方法自增问题
  3. matlab的开方算法_正确的「记事本」打开方式:能渲染3D图像,还能玩贪吃蛇
  4. 【pyqt5学习】——tablewidget控件学习
  5. 「javaScript-每三位插入一个逗号实现方式」
  6. 如果Python对于磁盘没有写入权限,还会运行吗?
  7. 【报告分享】2022戴森品牌社媒营销分析报告:搭“消费升级”快车,走“升维打击”路线.pdf(附下载链接)...
  8. Google 与微软的浏览器之争
  9. SVN安装配置以及启动
  10. 如何在远程桌面连接的服务器上访问本地磁盘
  11. 中职学校计算机大赛方案,中等职业学校电子技能赛的活动策划方案参考
  12. 在桌面计算机找不到驱动,电脑杀毒后桌面不见了的原因是什么_怎么解决 - 驱动管家...
  13. Quadratic equation
  14. 集成树模型系列之一——随机森林
  15. python 图片抓取
  16. 电脑游戏业编年史之十二──叛逆
  17. GEE:变异系数法在遥感影像分析中的应用及权重计算
  18. eNSP基础命令_01
  19. Expat XML parser
  20. 转 -- Zynga:从Amazon公共云到zCloud私有云

热门文章

  1. 爱立信携印度理工学院在印度设立5G研发中心
  2. JavaWeb个人通讯录实现(JSP+JDBC)
  3. 比wget更快的axel
  4. hph IIS配置问题
  5. 中小学电教信息计算机管理员职责,中小学电教工作的管理制度.doc
  6. php三维数组定义,PHP数组之三维数组
  7. Linux驱动修炼之道-混杂设备
  8. 做大数据用java还是python_新手零基础学做大数据工程师,编程学Java还是Python比较好?...
  9. vmware17虚拟机windows超详细安装教程(详细附图)
  10. 广和通受邀出席2022年中国5G发展大会,携手中国电信加速赋能万物智联