android异步向服务器请求数据
下面就android向服务器请求数据的问题分析如下:
1、在android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据;
- <span style="font-family:System;font-size:12px;">thread1 = new Thread(){
- @Override
- public void run() {
- try {
- URL url = new URL(WebUrlManager.CARSEVER_GetCarsServlet);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
- //缓冲读取
- byte[] data = new byte[1024];
- int len = 0;
- String bufferString = "";
- while((len = bis.read(data)) != -1){
- bufferString+=new String(data, 0, len);
- }
- carList = new JSONArray(bufferString.trim());
- //System.out.println(carList);
- /*
- for(int i=0;i<carList.length();i++){
- System.out.println("加载图片");
- JSONObject json = (JSONObject) carList.get(i);
- String imageName = json.getString("image");
- bm = BitmapFactory.decodeStream(new URL(WebUrlManager.CARSERVER_CAR_IMAGE+imageName).openStream());
- carImageArray.add(bm);
- }
- */
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- flag = true;
- }
- };
- thread1.start();</span>
2、新线程完成后一启动,发现报错,空指针nullpointerexception,要等待线程完毕后才能得到数据,下面是两种解决方法:
1)要么判断线程是否还活着;
2)要么在线程中设置一flag,结束后,更改其状态
- <span style="font-family:System;font-size:12px;">/*
- //等待线程thread1执行完毕
- while(true){
- if(thread1.isAlive()){
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }else{
- break;
- }
- }
- */
- //当线程还没结束,就睡500毫秒ms
- while(!flag){
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }</span>
3、处理返回的json数据
1)向服务器请求Json数据,保存在carList
- <span style="font-family:System;font-size:12px;">URL url = new URL(WebUrlManager.CARSEVER_GetCarsServlet);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
- //缓冲读取
- byte[] data = new byte[1024];
- int len = 0;
- String bufferString = "";
- while((len = bis.read(data)) != -1){
- bufferString+=new String(data, 0, len);
- }
- carList = new JSONArray(bufferString.trim());</span>
2)解析Json数据
- <span style="font-family:System;font-size:12px;">JSONObject car = (JSONObject) getItem(position);
- try {
- //this.pic.setImageBitmap(carImageArray.get(position));
- this.title.setText(car.getString("title"));
- this.describe.setText(car.getString("describe"));
- this.updateTime.setText(car.getString("updateTime"));
- this.price.setText(String.format("%.1f", car.getDouble("price"))+"万");
- this.pic.setTag(WebUrlManager.CARSERVER_CAR_IMAGE+car.getString("image"));
- new AsyncViewTask().execute(this.pic);
- } catch (JSONException e1) {
- e1.printStackTrace();
- }</span>
4、图片加载通常很慢,最好异步请求
1)先贴出异步请求的类源代码
- <span style="font-family:System;font-size:12px;">import java.io.InputStream;
- import java.lang.ref.SoftReference;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.HashMap;
- import android.graphics.drawable.Drawable;
- import android.os.AsyncTask;
- import android.util.Log;
- import android.view.View;
- import android.webkit.URLUtil;
- import android.widget.ImageView;
- /**
- * @author wzy qq:290581825 http://blog.csdn.net/wzygis
- */
- public class AsyncViewTask extends AsyncTask<View, Void, Drawable> {
- private View mView;
- private HashMap<String, SoftReference<Drawable>> imageCache;
- public AsyncViewTask() {
- imageCache = new HashMap<String, SoftReference<Drawable>>();
- }
- protected Drawable doInBackground(View... views) {
- Drawable drawable = null;
- View view = views[0];
- if (view.getTag() != null) {
- if (imageCache.containsKey(view.getTag())) {
- SoftReference<Drawable> cache = imageCache.get(view.getTag().toString());
- drawable = cache.get();
- if (drawable != null) {
- return drawable;
- }
- }
- try {
- if (URLUtil.isHttpUrl(view.getTag().toString())) {// 如果为网络地址。则连接url下载图片
- URL url = new URL(view.getTag().toString());
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setDoInput(true);
- conn.connect();
- InputStream stream = conn.getInputStream();
- drawable = Drawable.createFromStream(stream, "src");
- stream.close();
- } else {// 如果为本地数据,直接解析
- drawable = Drawable.createFromPath(view.getTag().toString());
- }
- } catch (Exception e) {
- Log.v("img", e.getMessage());
- return null;
- }
- }
- this.mView = view;
- return drawable;
- }
- protected void onPostExecute(Drawable drawable) {
- if (drawable != null) {
- ImageView view = (ImageView) this.mView;
- view.setImageDrawable(drawable);
- this.mView = null;
- }
- }
- }</span>
结果如下:
android异步向服务器请求数据的更多相关文章
- Java服务器对外提供接口以及Android端向服务器请求数据
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5056780.html 讲解下java服务器是如何对移动终端提供接口的,以什么数据格式提供出去,移动端又是怎么 ...
- jqGrid怎么设置初始化页面时不加载数据(不向服务器请求数据)
最近做一些表格一直用到jqGrid,今天遇到一个问题: 1.就是页面加载的时候数据不显示,点击搜索才根据请求从服务器返回并显示内容. 2.默认不从服务器请求数据(不然在开发者工具下会显示请求不到数据的 ...
- 前端向服务器请求数据并渲染的方式(ajax/jQuery/axios/vue)
原理: jQuery的ajax请求:complete函数一般无论服务器有无数据返回都会显示(成功或者失败都显示数据): return result
- React学习(4)——向服务器请求数据并显示
本文中涉及到的技术包括:node.js/express服务器的搭建.fetch发送数据请求. 在之前的几篇文章中,介绍了如何搭建基础的React项目,以及一些简单知识,现在,我们还需要掌握如何用Rea ...
- COMET探索系列三【异步通知服务器关闭数据连接实现思路】
在小编络络 COMET实践笔记一文中注意事项中有这么一段话 使用长连接时, 存在一个很常见的场景:客户端需要关闭页 面,而服务器端还处在读取数据的阻塞状态,客户端需要及时通知服务器端关闭数据连接.服务 ...
- Ajax的get请求向服务器请求数据五步骤?
如下: ①创建ajax对象 ②建立http请求 ③发送http请求 ④设置ajax对象状态改变的回调函数 ⑤判断ajax状态是否等于4,做相应的业务逻辑
- jQuery基础(Ajax,load(),getJSON(),getScript(),post(),ajax(),同步/异步请求数据)
1.使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callba ...
- 前端缓存API请求数据
1. 背景 在一些项目中,有时候会出现不同模块重复请求大量相同api接口的情况,特别是在一些功能相似的后台管理页面中.以下面这几个页面为例,每次进入页面都需要请求等大量重复的下拉框数据,下拉框数据短时 ...
- Android之三种网络请求解析数据(最佳案例)
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
随机推荐
- day15--JavaScript语言
JavaScript JavaScript是一门单独的编程语言.浏览器内置JavaScript的解释器. 独立的语言,浏览器具有js解释器. 存在与HTML中,在HTML中写JavaScript,存在 ...
- python常用内建模块--collections
1.namedtuple #namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素.#这样一来,我们用n ...
- Codeforces 744C Hongcow Buys a Deck of Cards 状压dp (看题解)
Hongcow Buys a Deck of Cards 啊啊啊, 为什么我连这种垃圾dp都写不出来.. 不是应该10分钟就该秒掉的题吗.. 从dp想到暴力然后gg, 没有想到把省下的红色开成一维. ...
- 【Java】 剑指offer(35) 复杂链表的复制
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现函数ComplexListNode* Clone(Compl ...
- java中函数传值和传地址的问题
记录一下这个难过的双休,2019.3.16-2019.3.17,16号上午字节跳动笔试,四道题只做出1道半,输入输出搞的半死,第三题类似于leetcode上的分糖问题,数组初始化的时候全部赋为0了,要 ...
- POJ1860-Currency Exchange (正权回路)【Bellman-Ford】
<题目链接> <转载于 >>> > 题目大意: 有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0. ...
- HDU 1542 矩形面积并【离散化+线段树+扫描线】
<题目链接> 题目大意: 给你n个矩形,求出它们面积的并. 解题分析: 此题主要用到了扫描线的思想,现将各个矩形的横坐标离散化,然后用它们离散化后的横坐标(相当于将矩形的每条竖线投影在x轴 ...
- 【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser
个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并 ...
- JS-排序详解-选择排序
说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在b的前面,排序后可能会交换 ...
- Java并发程序设计(五)JDK并发包之线程复用:线程池
线程复用:线程池 一.为什么需要线程池 为了避免系统频繁地创建和销毁线程,使用线程池让线程进行复用.(即创建线程变成了从线程池中获取空闲线程,销毁线程变成了把线程放回线程池中.) 二.JDK对线程池的 ...