下面就android向服务器请求数据的问题分析如下:

1、在android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据;

  1. <span style="font-family:System;font-size:12px;">thread1 = new Thread(){
  2. @Override
  3. public void run() {
  4. try {
  5. URL url = new URL(WebUrlManager.CARSEVER_GetCarsServlet);
  6. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  7. BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
  8. //缓冲读取
  9. byte[] data = new byte[1024];
  10. int len = 0;
  11. String bufferString = "";
  12. while((len = bis.read(data)) != -1){
  13. bufferString+=new String(data, 0, len);
  14. }
  15. carList = new JSONArray(bufferString.trim());
  16. //System.out.println(carList);
  17. /*
  18. for(int i=0;i<carList.length();i++){
  19. System.out.println("加载图片");
  20. JSONObject json = (JSONObject) carList.get(i);
  21. String imageName = json.getString("image");
  22. bm = BitmapFactory.decodeStream(new URL(WebUrlManager.CARSERVER_CAR_IMAGE+imageName).openStream());
  23. carImageArray.add(bm);
  24. }
  25. */
  26. } catch (MalformedURLException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. } catch (IOException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. } catch (JSONException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. flag = true;
  37. }
  38. };
  39. thread1.start();</span>

2、新线程完成后一启动,发现报错,空指针nullpointerexception,要等待线程完毕后才能得到数据,下面是两种解决方法:

1)要么判断线程是否还活着;

2)要么在线程中设置一flag,结束后,更改其状态

  1. <span style="font-family:System;font-size:12px;">/*
  2. //等待线程thread1执行完毕
  3. while(true){
  4. if(thread1.isAlive()){
  5. try {
  6. Thread.sleep(500);
  7. } catch (InterruptedException e) {
  8. // TODO Auto-generated catch block
  9. e.printStackTrace();
  10. }
  11. }else{
  12. break;
  13. }
  14. }
  15. */
  16. //当线程还没结束,就睡500毫秒ms
  17. while(!flag){
  18. try {
  19. Thread.sleep(500);
  20. } catch (InterruptedException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. }
  24. }
  25. }</span>

3、处理返回的json数据

1)向服务器请求Json数据,保存在carList

  1. <span style="font-family:System;font-size:12px;">URL url = new URL(WebUrlManager.CARSEVER_GetCarsServlet);
  2. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  3. BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
  4. //缓冲读取
  5. byte[] data = new byte[1024];
  6. int len = 0;
  7. String bufferString = "";
  8. while((len = bis.read(data)) != -1){
  9. bufferString+=new String(data, 0, len);
  10. }
  11. carList = new JSONArray(bufferString.trim());</span>

2)解析Json数据

  1. <span style="font-family:System;font-size:12px;">JSONObject car = (JSONObject) getItem(position);
  2. try {
  3. //this.pic.setImageBitmap(carImageArray.get(position));
  4. this.title.setText(car.getString("title"));
  5. this.describe.setText(car.getString("describe"));
  6. this.updateTime.setText(car.getString("updateTime"));
  7. this.price.setText(String.format("%.1f", car.getDouble("price"))+"万");
  8. this.pic.setTag(WebUrlManager.CARSERVER_CAR_IMAGE+car.getString("image"));
  9. new AsyncViewTask().execute(this.pic);
  10. } catch (JSONException e1) {
  11. e1.printStackTrace();
  12. }</span>

4、图片加载通常很慢,最好异步请求

1)先贴出异步请求的类源代码

  1. <span style="font-family:System;font-size:12px;">import java.io.InputStream;
  2. import java.lang.ref.SoftReference;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import java.util.HashMap;
  6. import android.graphics.drawable.Drawable;
  7. import android.os.AsyncTask;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.webkit.URLUtil;
  11. import android.widget.ImageView;
  12. /**
  13. * @author wzy qq:290581825  http://blog.csdn.net/wzygis
  14. */
  15. public class AsyncViewTask extends AsyncTask<View, Void, Drawable> {
  16. private View mView;
  17. private HashMap<String, SoftReference<Drawable>> imageCache;
  18. public AsyncViewTask() {
  19. imageCache = new HashMap<String, SoftReference<Drawable>>();
  20. }
  21. protected Drawable doInBackground(View... views) {
  22. Drawable drawable = null;
  23. View view = views[0];
  24. if (view.getTag() != null) {
  25. if (imageCache.containsKey(view.getTag())) {
  26. SoftReference<Drawable> cache = imageCache.get(view.getTag().toString());
  27. drawable = cache.get();
  28. if (drawable != null) {
  29. return drawable;
  30. }
  31. }
  32. try {
  33. if (URLUtil.isHttpUrl(view.getTag().toString())) {// 如果为网络地址。则连接url下载图片
  34. URL url = new URL(view.getTag().toString());
  35. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  36. conn.setDoInput(true);
  37. conn.connect();
  38. InputStream stream = conn.getInputStream();
  39. drawable = Drawable.createFromStream(stream, "src");
  40. stream.close();
  41. } else {// 如果为本地数据,直接解析
  42. drawable = Drawable.createFromPath(view.getTag().toString());
  43. }
  44. } catch (Exception e) {
  45. Log.v("img", e.getMessage());
  46. return null;
  47. }
  48. }
  49. this.mView = view;
  50. return drawable;
  51. }
  52. protected void onPostExecute(Drawable drawable) {
  53. if (drawable != null) {
  54. ImageView view = (ImageView) this.mView;
  55. view.setImageDrawable(drawable);
  56. this.mView = null;
  57. }
  58. }
  59. }</span>

结果如下:

android异步向服务器请求数据的更多相关文章

  1. Java服务器对外提供接口以及Android端向服务器请求数据

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5056780.html 讲解下java服务器是如何对移动终端提供接口的,以什么数据格式提供出去,移动端又是怎么 ...

  2. jqGrid怎么设置初始化页面时不加载数据(不向服务器请求数据)

    最近做一些表格一直用到jqGrid,今天遇到一个问题: 1.就是页面加载的时候数据不显示,点击搜索才根据请求从服务器返回并显示内容. 2.默认不从服务器请求数据(不然在开发者工具下会显示请求不到数据的 ...

  3. 前端向服务器请求数据并渲染的方式(ajax/jQuery/axios/vue)

    原理: jQuery的ajax请求:complete函数一般无论服务器有无数据返回都会显示(成功或者失败都显示数据): return result

  4. React学习(4)——向服务器请求数据并显示

    本文中涉及到的技术包括:node.js/express服务器的搭建.fetch发送数据请求. 在之前的几篇文章中,介绍了如何搭建基础的React项目,以及一些简单知识,现在,我们还需要掌握如何用Rea ...

  5. COMET探索系列三【异步通知服务器关闭数据连接实现思路】

    在小编络络 COMET实践笔记一文中注意事项中有这么一段话 使用长连接时, 存在一个很常见的场景:客户端需要关闭页 面,而服务器端还处在读取数据的阻塞状态,客户端需要及时通知服务器端关闭数据连接.服务 ...

  6. Ajax的get请求向服务器请求数据五步骤?

    如下: ①创建ajax对象 ②建立http请求 ③发送http请求 ④设置ajax对象状态改变的回调函数 ⑤判断ajax状态是否等于4,做相应的业务逻辑

  7. jQuery基础(Ajax,load(),getJSON(),getScript(),post(),ajax(),同步/异步请求数据)

    1.使用load()方法异步请求数据   使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为:   load(url,[data],[callba ...

  8. 前端缓存API请求数据

    1. 背景 在一些项目中,有时候会出现不同模块重复请求大量相同api接口的情况,特别是在一些功能相似的后台管理页面中.以下面这几个页面为例,每次进入页面都需要请求等大量重复的下拉框数据,下拉框数据短时 ...

  9. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

随机推荐

  1. 【BZOJ】3123: [Sdoi2013]森林

    题解 ------------------ 我莫不是一个智障吧 我把testdata的编号 当成数据组数读进来 我简直有毒 以为哪里写错了自闭了好久 实际上这题很简单,只要愉悦地开个启发式合并,然后每 ...

  2. python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)

    1.昨日内容回顾 1.正则表达式     # 正则表达式 —— str           # 检测字符串是否符合要求     # 从大段的文字中找到符合要求的内容 1).元字符 #. # 匹配除换行 ...

  3. BZOJ5071 小A的数字 BZOJ2017年10月月赛 其他

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5071 题意概括 题解 一开始蒙了. 感觉做过类似的题目. 但是找不到方法. 突然想到前缀和! 对于 ...

  4. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  5. HBase 开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 首先, 搭建基于MyEclipse的Hadoop开发环境 相信,能看此博客的朋友,想必是有一定基础的了.我前期写了大量的基础性博文.可以去补下基础. 比如, CentOS图形界面下如何安 ...

  6. Python常用模块--logging

    (转载) 原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python内置的标准模块,主要用于 ...

  7. SpringMVC框架09——@ResponseBody的用法详解

    @ResponseBody可以标注在方法上也可以标注在类上面.简单来说,当标注在方法上时,该方法的返回结果直接转成JSON格式:当标注在类上时,该类中的所有方法的返回结果都转换成JSON格式. 代码示 ...

  8. <<c专家编程>>笔记

    C专家编程摘录 c操作符的优先级 有时一些c操作符有时并不会像你想象的那样工作. 下方表格将说明这个问题: 优先级问题 表达式 期望的情况 实际情况 . 优先级高于* *p.f (*p).f *(p. ...

  9. [POI2011]Rotacje na drzewie (2)/[BZOJ3702]二叉树

    [POI2011]Rotacje na drzewie (2) 题目大意: 一棵有\(n\)个叶子结点的二叉树,每个叶子结点有一个权值,恰好是\(1\sim n\)的一个排列,你可以任意交换每一对子结 ...

  10. kaggle PredictingRedHatBusinessValue 简单的xgboost的交叉验证

    PredictingRedHatBusinessValue 这个超级简单的比赛 随手在一个kernels上面随便改了改,交叉验证的xgboost: 感觉还是稍微有一点借鉴意义的(x 注释的部分是One ...