17-07-31 android 方法 如何引用链接获取json数据(改进版)

来源:互联网 发布:哪个走路软件可以赚钱 编辑:程序博客网 时间:2024/05/21 07:52

07-29写的方法今回头一看太烂了,今天对代码进行了改进,当然还需要后续进一步的完善。

MainActivity 的方法部分改进了
package com.example.juren;import java.io.InputStream;import java.net.HttpURLConnection;import java.util.HashMap;import java.util.Map;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import com.example.juren.MyThread.ResponseInfo;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;/* {    "categorys": [        {            "id": "1",            "name": "综合",            "icon": "http://114.55.116.95:8080/shusheng/images/zhonghe.png",            "short_desc": "十八般武器样样精通",            "desc": "NULL"        },        {            "id": "2",            "name": "地理",            "icon": "http://114.55.116.95:8080/shusheng/images/dili.png",            "short_desc": "坐地日行八万里,巡天遥看一千河",            "desc": "NULL"        },        {            "id": "3",            "name": "文学",            "icon": "http://114.55.116.95:8080/shusheng/images/wenxue.png",            "short_desc": "NULL",            "desc": "NULL"        },        {            "id": "4",            "name": "体育",            "icon": "http://114.55.116.95:8080/shusheng/images/tiyu.png",            "short_desc": "NULL",            "desc": "NULL"        },        {            "id": "5",            "name": "生活",            "icon": "http://114.55.116.95:8080/shusheng/images/shenghuo.png",            "short_desc": "NULL",            "desc": "NULL"        },        {            "id": "6",            "name": "生物",            "icon": "http://114.55.116.95:8080/shusheng/images/shengwu.png",            "short_desc": "NULL",            "desc": "NULL"        },        {            "id": "7",            "name": "军事",            "icon": "http://114.55.116.95:8080/shusheng/images/junshi.png",            "short_desc": "NULL",            "desc": "NULL"        },        {            "id": "8",            "name": "历史",            "icon": "http://114.55.116.95:8080/shusheng/images/lishi.png",            "short_desc": "NULL",            "desc": "NULL"        }    ],    "status": "success"} */public class MainActivity extends Activity{public static final String URL = "http://114.55.116.95:8080/shusheng/home_page";private Handler mHandler = new MyHandler();public LinearItemView mItem1;public LinearItemView mItem2;public GridItemView tItem1;public GridItemView tItem2;public GridItemView tItem3;public GridItemView tItem4;public GridItemView tItem5;public GridItemView tItem6;private Map<String, Bitmap> mCache = new HashMap<String, Bitmap>();@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mItem1 = (LinearItemView) findViewById(R.id.include1);mItem2 = (LinearItemView) findViewById(R.id.include2);tItem1 = (GridItemView) findViewById(R.id.include_1);tItem2 = (GridItemView) findViewById(R.id.include_2);tItem3 = (GridItemView) findViewById(R.id.include_3);tItem4 = (GridItemView) findViewById(R.id.include_4);tItem5 = (GridItemView) findViewById(R.id.include_5);tItem6 = (GridItemView) findViewById(R.id.include_6);MyThread thread = new MyThread(URL, mHandler);thread.start();}public class MyHandler extends Handler{public void handleMessage(Message msg){if (msg.what == 1){ResponseInfo response = (ResponseInfo) msg.obj;if (response.status.equals(MyThread.STATUS_FAILED)){setfailedUIDatas(response);}else{HomePageInfo homePageInfo = parseHomePageInfo(response);setSuccessUIDatas(homePageInfo);// TODO 下载相关图片loadImages(homePageInfo);}}else if (msg.what == 1000){Bitmap bmp = mCache.get(msg.obj);if(msg.arg1 == 1){mItem1.setIcons(bmp);}if(msg.arg1 == 2){mItem2.setIcons(bmp);}if(msg.arg1 == 3){tItem1.setIcons(bmp);}if(msg.arg1 == 4){tItem2.setIcons(bmp);}if(msg.arg1 == 5){tItem3.setIcons(bmp);}if(msg.arg1 == 6){tItem4.setIcons(bmp);}if(msg.arg1 == 7){tItem5.setIcons(bmp);}if(msg.arg1 == 8){tItem6.setIcons(bmp);}}}}public void setfailedUIDatas(ResponseInfo response){}public void loadImages(final HomePageInfo homePageInfo){new Thread(){public void run(){//匿名内部类方法中,想要使用方法参数,需要把参数声明为final类型for(int i = 0; i < homePageInfo.categorys.size(); i ++){CategoryInfo item = homePageInfo.categorys.get(i);String url = item.icon;Bitmap bm1 = getHttpBitmap(url);mCache.put(url,bm1);Message msg = new Message();msg.obj = url;//在HandlMessage中用于找到对应的Bitmapmsg.what = 1000;msg.arg1 = i+1;//在HandlMessage中找到对应的 ImageViewmHandler.sendMessage(msg);}}}.start();}public void setSuccessUIDatas(HomePageInfo homePageInfo){// TODO Auto-generated method stubLog.i("aaa", "size = " + homePageInfo.categorys.size());for (int i = 0; i < homePageInfo.categorys.size(); i++){CategoryInfo catInfo = homePageInfo.categorys.get(i);if (i == 0){mItem1.setDatas(catInfo.name, catInfo.short_desc, catInfo.desc);}if (i == 1){mItem2.setDatas(catInfo.name, catInfo.short_desc, catInfo.desc);}if (i == 2){tItem1.setDatas(catInfo.name);}if (i == 3){tItem2.setDatas(catInfo.name);}if (i == 4){tItem3.setDatas(catInfo.name);}if (i == 5){tItem4.setDatas(catInfo.name);}if (i == 6){tItem5.setDatas(catInfo.name);}if (i == 7){tItem6.setDatas(catInfo.name);}}}public HomePageInfo parseHomePageInfo(ResponseInfo response){HomePageInfo homePageInfo = new HomePageInfo();// TODO Auto-generated method stubJSONObject root = null;try{root = new JSONObject(response.responseString);}catch (JSONException e){// TODO Auto-generated catch blocke.printStackTrace();}JSONArray categorysJSONArray = root.optJSONArray("categorys");for (int i = 0; i < categorysJSONArray.length(); i++){CategoryInfo catInfo = new CategoryInfo();JSONObject item = (JSONObject) categorysJSONArray.opt(i);catInfo.id = item.optString("id");catInfo.name = item.optString("name");catInfo.icon = item.optString("icon");catInfo.short_desc = item.optString("short_desc");catInfo.desc = item.optString("desc");homePageInfo.categorys.add(catInfo);}return homePageInfo;}public static Bitmap getHttpBitmap(String url){java.net.URL myFileURL;Bitmap bitmap = null;try{myFileURL = new java.net.URL(url);// 获得连接HttpURLConnection conn = (HttpURLConnection) myFileURL.openConnection();// 设置超时时间为6000毫秒,conn.setConnectionTiem(0);表示没有时间限制conn.setConnectTimeout(6000);// 连接设置获得数据流conn.setDoInput(true);// 不使用缓存conn.setUseCaches(false);// 这句可有可无,没有影响// conn.connect();// 得到数据流InputStream is = conn.getInputStream();// 解析得到图片bitmap = BitmapFactory.decodeStream(is);// 关闭数据流is.close();}catch (Exception e){e.printStackTrace();}return bitmap;}}

MyThread.java

package com.example.juren;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import org.json.JSONObject;import android.os.Handler;import android.os.Message;public class MyThread extends Thread{public Handler mHandler;public String requrl;public static final String STATUS_SUCCESS = "success";public static final String STATUS_FAILED = "failed";public MyThread(String url, Handler handler){this.requrl = url;mHandler = handler;}public void run(){ResponseInfo data = request(requrl);Message msg = new Message();msg.what = 1;msg.obj = data;mHandler.sendMessage(msg);}private ResponseInfo request(String requrl){ResponseInfo responseData = new ResponseInfo();URLConnection conn;URL url = null;HttpURLConnection httpConn = null;int response = -1;try{InputStream is = null;url = new URL(requrl);conn = url.openConnection();// 打开一个链接conn.setConnectTimeout(10000);// 设置链接超时时间conn.setReadTimeout(10000);// 设置读取超时时间httpConn = (HttpURLConnection) conn;httpConn.setAllowUserInteraction(false);httpConn.setInstanceFollowRedirects(true);httpConn.setRequestMethod("GET");// 使用http的Get方法httpConn.connect();// 开始连接response = httpConn.getResponseCode();// 每次连接都会有一个response codeif (response == HttpURLConnection.HTTP_OK){// 通过这次连接获取数据is = httpConn.getInputStream();String jsonString = convertStreamToString(is);responseData.responseString = jsonString;JSONObject object = new JSONObject(jsonString);// 如何使用一个字符串创建一个JSONObject对象responseData.status = object.optString("status");// 根据一个JSONObject对象中的key来找到valueif (responseData.status.equals(STATUS_SUCCESS)){return responseData;}// 连接成功了,但服务器返回了无效的数据responseData.status = STATUS_FAILED;responseData.exceptionString = "获取数据失败";return responseData;}else{responseData.status = STATUS_FAILED;responseData.exceptionString = "获取数据失败";return responseData;}}catch (Exception e){responseData.status = STATUS_FAILED;responseData.exceptionString = "获取数据失败!";}finally{if (httpConn != null){httpConn.disconnect();}}return responseData;}// 把输入流数据转换成字符串数据public static String convertStreamToString(InputStream is){BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder sb = new StringBuilder();String line = null;try{while ((line = reader.readLine()) != null){sb.append(line + "\n");}}catch (IOException e){e.printStackTrace();}finally{try{is.close();}catch (IOException e){e.printStackTrace();}}return sb.toString();}public static class ResponseInfo{// 获取是否成功,failed 或 successpublic String status;// 如果获取成功了返回的数据信息public String responseString;// 如果失败了连接失败的错误信息public String exceptionString;}}

HomePageInfo.java

package com.example.juren;import java.util.ArrayList;public class HomePageInfo{public ArrayList<CategoryInfo> categorys = new ArrayList<CategoryInfo>();public String status;}

CategoryInfo.java

package com.example.juren;/* * *"id": "1",            "name": "综合",            "icon": "http://114.55.116.95:8080/shusheng/images/zhonghe.png",            "short_desc": "十八般武器样样精通",            "desc": "NULL" */public class CategoryInfo{public String id;public String name;public String icon;public String short_desc;public String desc;}

LinearItemView.java 用来定义linearItemView_xml 元素,简化了ui的代码

package com.example.juren;import android.content.Context;import android.graphics.Bitmap;import android.util.AttributeSet;import android.util.Log;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;/* * *子类必须要实现父类的至少一个构造器,系统默认一个无参的构造器 */public class LinearItemView extends RelativeLayout{public ImageView mImageView;public TextView mTitle_one;public TextView mTitle_two;public TextView mTitle_three;public LinearItemView(Context context, AttributeSet attrs){super(context, attrs);Log.i("item", "这是第二个构造器");}@Overrideprotected void onFinishInflate(){super.onFinishInflate();mImageView = (ImageView) findViewById(R.id.image3);mTitle_one = (TextView) findViewById(R.id.title);mTitle_two = (TextView) findViewById(R.id.subhead);mTitle_three = (TextView) findViewById(R.id.detal);}public void setDatas(String one,String two,String three){mTitle_one.setText(one);mTitle_two.setText(two);mTitle_three.setText(three);}public void setIcons(Bitmap bmp){mImageView.setImageBitmap(bmp);}}

GridItemView.java  同上

<pre class="java" name="code">package com.example.juren;import android.content.Context;import android.graphics.Bitmap;import android.util.AttributeSet;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;public class GridItemView extends LinearLayout{public ImageView tImage;public TextView tTitle;public GridItemView(Context context, AttributeSet attrs){super(context, attrs);// TODO Auto-generated constructor stub}@Overrideprotected void onFinishInflate(){super.onFinishInflate();tImage = (ImageView) findViewById(R.id.tIcon);tTitle = (TextView) findViewById(R.id.tTitle);}public void setDatas(String one){tTitle.setText(one);}public void setIcons(Bitmap bmp){tImage.setImageBitmap(bmp);}}

activity_main.xml 对比后比原来简洁多了,可读性也高了

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:background="#EFEFF4"    android:orientation="vertical" >    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="#FFFFFF"        android:gravity="center"        android:paddingBottom="14dp"        android:paddingTop="14dp"        android:text="@string/hello_world"        android:textColor="#666666"        android:textSize="17sp" />    <TextView        android:layout_width="match_parent"        android:layout_height="1dp" />    <ScrollView        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:overScrollMode="never" >        <LinearLayout            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:orientation="vertical"            android:paddingBottom="7dp"            android:paddingTop="7dp" >            <include                android:id="@+id/include1"                layout="@layout/linear_item" />            <include                android:id="@+id/include2"                layout="@layout/linear_item" />            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginLeft="11dp"                android:layout_marginRight="11dp"                android:orientation="horizontal" >                <include                    android:id="@+id/include_1"                    layout="@layout/grid_item" />                <include                    android:id="@+id/include_2"                    layout="@layout/grid_item" />                <include                    android:id="@+id/include_3"                    layout="@layout/grid_item" />            </LinearLayout><LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginLeft="11dp"                android:layout_marginRight="11dp"                android:orientation="horizontal" >                <include                    android:id="@+id/include_4"                    layout="@layout/grid_item" />                <include                    android:id="@+id/include_5"                    layout="@layout/grid_item" />                <include                    android:id="@+id/include_6"                    layout="@layout/grid_item" />            </LinearLayout>            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginLeft="11dp"                android:layout_marginRight="11dp"                android:orientation="horizontal" >                <include                    android:id="@+id/include_7"                    layout="@layout/grid_item" />                <include                    android:id="@+id/include_8"                    layout="@layout/grid_item" />                <include                    android:id="@+id/include_9"                    layout="@layout/grid_item" />            </LinearLayout>                    </LinearLayout>    </ScrollView>    <TextView        android:layout_width="match_parent"        android:layout_height="1dp" /></LinearLayout>

Linear_item.xml  是上面定义的include元素,

在activity_main中使用时要保证属性都一样,不一样的属性放到外层单独定义

注意下面最外层的使用方法:包名 + 类名

<com.example.juren.LinearItemView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginLeft="19dp"    android:layout_marginRight="19dp"    android:layout_marginTop="7dp"    android:layout_marginBottom="7dp"    android:background="@drawable/background" >    <ImageView        android:id="@+id/image3"        android:layout_width="58dp"        android:layout_height="58dp"        android:layout_alignParentLeft="true"        android:layout_margin="19dp"        android:src="@drawable/xxhl" />    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:layout_toLeftOf="@+id/image4"        android:layout_toRightOf="@id/image3"        android:orientation="vertical" >        <TextView            android:id="@+id/title"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:gravity="left"            android:text="@string/hello"            android:textColor="#222222"            android:textSize="16sp" />        <TextView            android:id="@+id/subhead"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:gravity="left"            android:singleLine="true"            android:text="@string/hello1"            android:textColor="#cccccc"            android:textSize="12sp" />        <TextView            android:id="@+id/detal"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:gravity="left"            android:text="@string/hello2"            android:textColor="#cccccc"            android:textSize="12sp" />    </LinearLayout>    <ImageView        android:id="@+id/image4"        android:layout_width="21dp"        android:layout_height="21dp"        android:layout_alignParentRight="true"        android:layout_centerVertical="true"        android:layout_marginLeft="19dp"        android:layout_marginRight="19dp"        android:src="@drawable/xxhr" /></com.example.juren.LinearItemView>

grid_item.xml  同上

<com.example.juren.GridItemView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginBottom="7dp"    android:layout_marginLeft="8dp"    android:layout_marginRight="8dp"    android:layout_marginTop="7dp"    android:background="@drawable/background"    android:gravity="center_horizontal"    android:orientation="vertical" >    <ImageView        android:id="@+id/tIcon"        android:layout_width="58dp"        android:layout_height="58dp"        android:layout_marginLeft="19dp"        android:layout_marginRight="19dp"        android:layout_marginTop="19dp"        android:src="@drawable/xxhl" />    <TextView        android:id="@+id/tTitle"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginBottom="19dp"        android:layout_marginTop="14dp"        android:text="@string/hello6"        android:textColor="#333333"        android:textSize="14dp" >    </TextView></com.example.juren.GridItemView>

改良后的代码如上,还需要完善继续改进...










0 0