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

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>();

	@Override
	protected 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中用于找到对应的Bitmap
					msg.what = 1000;
					msg.arg1 = i+1;//在HandlMessage中找到对应的 ImageView
					mHandler.sendMessage(msg);
				}
			}
		}.start();
	}

	public void setSuccessUIDatas(HomePageInfo homePageInfo)
	{
		// TODO Auto-generated method stub
		Log.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 stub
		JSONObject root = null;

		try
		{
			root = new JSONObject(response.responseString);
		}
		catch (JSONException e)
		{
			// TODO Auto-generated catch block
			e.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 code

			if (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来找到value

				if (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 或 success
		public 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", "这是第二个构造器");
	}

	@Override
	protected 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
	}

	@Override
	protected 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
,你能给我一个示例代码吗? 当然可以,以下是一个使用HttpURLConnection进行post请求的示例代码: ``` URL apiUrl = new URL("your_api_url_here"); HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection(); // 设置请求类型为POST connection.setRequestMethod("POST"); // 设置请求头 connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); // 开启输出流,因为我们要向服务器发送数据 connection.setDoOutput(true); // 构建请求体,这里假设我们要传递一个JSON对象为请求体 JSONObject requestBody = new JSONObject(); requestBody.put("param1", "value1"); requestBody.put("param2", "value2"); String requestBodyString = requestBody.toString(); // 将请求体写入输出流 OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write(requestBodyString); writer.flush(); writer.close(); // 获取口返回的数据 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream responseStream = connection.getInputStream(); String responseData = convertStreamToString(responseStream); responseStream.close(); // 处理返回的数据 } else { // 口请求失败,处理异常 } // 关闭连 connection.disconnect(); ``` 在这个示例中,我们首先构建了一个URL对象,并使用它创建了一个HttpURLConnection对象。着,我们设置了请求方式为POST,并设置了请求头,然后开启了输出流并写入请求体。最后获取口返回的数据并处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值