具体处理思路以及使用到的知识点:
1.使用android的异步处理
2.将要使用的功能(方法)进行封装,以便主类进行调用
3.前台展示要使用适配器模型(这里使用简单适配器(SimpleAdapter))
主类的代码:
package com.example.lenovo.asynctask_json; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; import com.example.lenovo.asynctask_json.domin.NetUtils; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import java.util.Map; /** * {}代表 json对象 * []:代表时json 数组 * * {key:value,key:value,key:value.....} * * { * name:"张三", * * age:20, * * tel:[111,222,333,444], * * loves:[ * {ball:"球"}, * {game:"游戏"} * * ] * * } */ public class MainActivity extends AppCompatActivity { private ListView listView_movie; private SimpleAdapter adapter; private List<Map<String,Object>> list; //private String path="http://lib.wap.zol.com.cn/ipj/docList.php?class_id=0&page=1&vs=and380&retina=1 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.listView_movie= (ListView) this.findViewById(R.id.listView_movie); String path= null; try { //URLEncoder.encode("热门","utf-8"):将汉字进行Unicode编码 path = "https://movie.douban.com/j/search_subjects?type=movie&tag="+ URLEncoder.encode("热门","utf-8")+"&sort=recommend&page_limit=20&page_start=21"; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } new NetDownLoadAsyncTask().execute(path); } private final class NetDownLoadAsyncTask extends AsyncTask<String,Void,List<Map<String,Object>>>{ @Override protected List<Map<String, Object>> doInBackground(String... params) { //调用NetUtils类的方法,将网址对应的数据以InputStream的形式返回. InputStream inputStream=NetUtils.getInputStreamByPath(params[0]); if(inputStream!=null){ //调用NetUtils类的方法,将输入流转换成字符串. String json=NetUtils.getStringByInputStream(inputStream); System.out.println("json="+json); if(json!=null){ //调用NetUtils类的方法,对json对象进行处理 list= NetUtils.getListMapByJsonString(json); return list; } } return null; } @Override protected void onPostExecute(List<Map<String, Object>> maps) { if(maps!=null){ System.out.println("maps="+maps); adapter=new SimpleAdapter( MainActivity.this,//上下文对象 maps,//数据源 R.layout.movie_item,//前台要展示的,这里是(自己定义到格式)对应点击条目的样式 new String[]{"title","cover"},//键值"title"与"cover" new int[]{R.id.textView_title,R.id.imageView_cover}//控件对应id的int型数组 ){ /** * 当每绘制一条条目对象时自动调用的方法 * @param position * @param convertView * @param parent * @return */ @Override public View getView(int position, View convertView, ViewGroup parent) { //System.out.println("===getView(int position="+position+", View convertView="+convertView+", ViewGroup parent="+parent+")==="); //得到当前绘制的条目对象 View view=super.getView(position, convertView, parent); //System.out.println("view="+view); ImageView imageView_cover= (ImageView) view.findViewById(R.id.imageView_cover); Map<String,Object> map=list.get(position); Bitmap bitmap= (Bitmap) map.get("cover"); //手工设置imageView对应的bitmap对象 imageView_cover.setImageBitmap(bitmap); return view; } }; listView_movie.setAdapter(adapter); System.out.println("======="); }else { System.out.println("从网络上获取数据失败!"); } } } }
封装好的代码:
package com.example.lenovo.asynctask_json.domin; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by hsjwcf on 2018/5/29. */ public class NetUtils { /** * 将给你的网址对应的数据以InputStream的形式返回 * @param path * @return */ public static InputStream getInputStreamByPath(String path){ try { URL url=new URL(path); HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection(); httpURLConnection.setConnectTimeout(3000); /* httpURLConnection.getResponseCode()干了两件事: A:根据指定的网址向服务器发送请求并得到服务器的回应 B:在回应中包含状态码:200表示访问成功 */ int responseCode=httpURLConnection.getResponseCode(); if(responseCode==200){//说明本次访问成功 //以输入流的形式得到服务器返回的数据 InputStream inputStream=httpURLConnection.getInputStream(); return inputStream; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 根据输入流得到字节数组 * @param inputStream * @return */ public static byte[] getBytesByInputStream(InputStream inputStream){ ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int len=0; try { while ((len=inputStream.read(buffer))!=-1){ byteArrayOutputStream.write(buffer,0,len); } return byteArrayOutputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * 根据输入流得到字符串 * @param inputStream * @return */ public static String getStringByInputStream(InputStream inputStream){ ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int len=0; try { while ((len=inputStream.read(buffer))!=-1){ byteArrayOutputStream.write(buffer,0,len); } return byteArrayOutputStream.toString(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * 通过解析json 字符串得到List<Map<String,Object>>类型的对象 * * * { "subjects": [ { "rate": "8.3", "cover_x": 3578, "title": "暴裂无声", "url": "https://movie.douban.com/subject/26647117/", "playable": true, "cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2517333671.jpg", "id": "26647117", "cover_y": 5078, "is_new": false }, { "rate": "7.0", "cover_x": 1500, "title": "负重前行", "url": "https://movie.douban.com/subject/26793157/", "playable": false, "cover": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2518648419.jpg", "id": "26793157", "cover_y": 2222, "is_new": false } ] } * @param json * @return */ public static List<Map<String,Object>> getListMapByJsonString(String json){ List<Map<String,Object>> list=new ArrayList<>(); try { //1.将json 字符串转换成Json对象 JSONObject jsonObject=new JSONObject(json); //2.根据键得到json 数组 JSONArray jsonArray=jsonObject.getJSONArray("subjects"); //得到数组中元素的个数 int len=jsonArray.length(); for(int i=0;i<len;i++){ Map<String,Object> map=new HashMap<>(); jsonObject= jsonArray.getJSONObject(i); String title=jsonObject.getString("title"); String cover=jsonObject.getString("cover"); System.out.println("cover="+cover); //String cover=jsonArray.getString(0); map.put("title",title); //将数据源中cover 对应的网址转换成Bitmap 对象 InputStream inputStream=getInputStreamByPath(cover); byte[] data=getBytesByInputStream(inputStream); Bitmap bitmap=BitmapFactory.decodeByteArray(data,0,data.length); map.put("cover",bitmap); list.add(map); } } catch (JSONException e) { e.printStackTrace(); } return list; } }
前台展示:
<1>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_gravity="center_horizontal" android:id="@+id/imageView_cover" android:layout_width="200dp" android:layout_height="200dp" /> <TextView android:layout_gravity="center_horizontal" android:textSize="30sp" android:id="@+id/textView_title" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
<2>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listView_movie" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>