andorid——从服务器端读取文件,并下载图片内容

目录

 

第一步:视图创建完成

第二步:绑定视图——创建activity

第三步创建Adapter,但是先创建Adapter所需的样式XML

第四步:创建Adapter

第五步:servlet的json文件

第六步:配置网络权限和视图绑定

/*
 * 示例:
 * 1,加载服务端的json信息,该信息是由数据库生成的
 * 2,json包含的信息:   Users对象,该对象的属性:id,name,age,tupain
 * 3,这四个属性id我们不用显示,name和age可以存入users,但是图片存储的是头像图片的名字
 * 4,我们还要根据这个名字去开启线程来进行下载
 * 5,下载后把图片数组和users数组都传入adapter注入到listview
 * 
 * 步骤:
 * 定义一个json在servlet----->
 * 开启线程获取json----->
 * 解析json----->
 * 把text信息存入users,把图片名字存图另一个数组----->
 * 根据存名字的数组来下载图片----->
 * 下载完毕手写自定义的Adapter,在这之前先写一个样式xml----->
 * 由于样式视图是一个图片视图和两个TextView视图,所以我们需要的是一个BistBsers和一个ListBitmap----->
 * 加上上下文一共三个参数,
 * 写完Adapter然后定义一个MaAdapter继承我们自定义的Adapteer----->
 * 然后在一个页面把一个listview视图跟这个填充器绑定
 */


第一步:视图创建完成

<?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"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60px" 
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView0"
            android:layout_width="120px"
            android:layout_height="60px"
            android:text="头像" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="480px"
            android:layout_height="60px"
            android:text="名字" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="480px"
            android:layout_height="60px"
            android:text="年龄" />

    </LinearLayout>

    <!-- 放名字 -->

    <!-- 放年龄 -->

    <!-- 单存用来遍历的 -->

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="267dp" >
    </ListView>

</LinearLayout>

第二步:绑定视图——创建activity

package com.example.testloadimage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import com.example.adapter.MyAdapter;
import com.example.entity.Users;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import android.widget.Toast;

/*
 * 示例:
 * 1,加载服务端的json信息,该信息是由数据库生成的
 * 2,json包含的信息:   Users对象,该对象的属性:id,name,age,tupain
 * 3,这四个属性id我们不用显示,name和age可以存入users,但是图片存储的是头像图片的名字
 * 4,我们还要根据这个名字去开启线程来进行下载
 * 5,下载后把图片数组和users数组都传入adapter注入到listview
 * 
 * 步骤:
 * 定义一个json在servlet----->
 * 开启线程获取json----->
 * 解析json----->
 * 把text信息存入users,把图片名字存图另一个数组----->
 * 根据存名字的数组来下载图片----->
 * 下载完毕手写自定义的Adapter,在这之前先写一个样式xml----->
 * 由于样式视图是一个图片视图和两个TextView视图,所以我们需要的是一个BistBsers和一个ListBitmap----->
 * 加上上下文一共三个参数,
 * 写完Adapter然后定义一个MaAdapter继承我们自定义的Adapteer----->
 * 然后在一个页面把一个listview视图跟这个填充器绑定
 */
public class TestActivity extends Activity{
	//前台线程
	private Handler myHandler;
	//解析后存信息的集合
	private List<Users> lt;
	//显示信息的listview
	private ListView listview;
	//下载线程的图片存储数组
	private List<Bitmap> bis = new ArrayList<Bitmap>();
	//需要下载图片的名字,全局变量,图片下载线程可以直接调用
	private List<String> load = new ArrayList<String>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		//绑定视图
		super.setContentView(R.layout.index);
		//实例所有需要使用的变量
		myHandler=new MyHandler();
		lt = new ArrayList<Users>();
		listview = (ListView)this.findViewById(R.id.listView1);

		//实例访问解析的线程,并启动
		MyThread myThread = new MyThread();
		myThread.start();

	}

	//解析json的线程
	class MyThread extends Thread{
		@Override
		public void run() {
			URL url;
			HttpURLConnection conn =null;
			try {
				//存放json的路径
				url = new URL("http://192.168.1.103:8080/TestAndroid/Goods.json");
				conn = (HttpURLConnection)url.openConnection();
				//设置链接权限,和链接最大时间时限,加入机器和网络好可以不用设置
				conn.setDoInput(true);
				conn.setDoOutput(true);
				conn.setConnectTimeout(50000);
				//读取服务器端的json文件
				InputStream is = conn.getInputStream();
				int data =0;
				String neirong = "";
				while((data = is.read())!=-1) {
					neirong+=(char)data;
				}
				//手动解析线程,把stringjson传入然后获得一个json数组对象
				JSONArray array = new JSONArray(neirong);
				System.out.println(neirong);

				for (int i = 0; i < array.length(); i++) {
					//通过遍历获得该数组的每个对象
					JSONObject obj = array.getJSONObject(i);
					//取出每个对象的属性
					int id = obj.getInt("id");
					String name = obj.getString("name");
					int age = obj.getInt("age");
					String tupian = obj.getString("tupian");
					//单独的把图片的信息假如到一个数组,等下用来
					load.add(tupian);
					//把其他信息存入user对象,把对象加入到数组
					Users users = new Users(id, name, age, tupian);
					lt.add(users);
				}
				//加载完所有的json信息后开启图片下载线程,下载所有的用户头像
				MyLoadThread loadThread = new MyLoadThread();
				loadThread.start();
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	//下载图片的线程
	class MyLoadThread extends Thread{
		@Override
		public void run() {
			//因为图片不止一张然后就通过循环来下载完
			for (int i = 0; i < load.size(); i++) {
				try {
					//经过解析线程以后,图片的名字已经加入到了名字数组,我们前面的路径是项目的固定网络路径
					//在加上对应的图片名字就能访问到该图片
					URL url = new URL("http://192.168.1.103:8080/TestAndroid/"+load.get(i));
					System.out.println("loadtupian=====>"+url);
					
					HttpURLConnection conn = (HttpURLConnection)url.openConnection();

					conn.setDoInput(true);
					conn.setDoOutput(true);
					conn.setConnectTimeout(50000);
					
					//通过图片路径的输入流,可以直接将输入流的信息变为一张图片
					InputStream is = conn.getInputStream();
					Bitmap bitmap = BitmapFactory.decodeStream(is);

					//从客户端读取的图片封装成一个图片对象,然后加入到全局变量图片数组中,等下当做参数传入Adapter
					bis.add(bitmap);

				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			//当图片下载完成以后,所有的信息就都有了,我们就可以把信息绑定到listview中
			//不过后台线程thread是不允许操作前台的控件的,所以我们需要把这个写在前台线程中
			Message msg = new Message();
			TestActivity.this.myHandler.sendMessage(msg);
		}
	}

	//继承自定义的填充器模式,该填充器可以与一个列表视图进行绑定
	class MyAdapter1 extends MyAdapter{
		public MyAdapter1(Context context, List<Users> lt, List<Bitmap> bits) {
			super(context, lt, bits);
			// TODO Auto-generated constructor stub
		}
	}
	class MyHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			//前台线程的工作就是将listview和Adapter绑定
			listview.setAdapter(new MyAdapter1(TestActivity.this, lt, bis));
		}
	}
}

第三步创建Adapter,但是先创建Adapter所需的样式XML

<?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"
    android:orientation="horizontal" >

    <!-- 放头像的视图 -->
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="120px"
        android:layout_height="120px"
        android:src="@drawable/abc_ab_bottom_solid_dark_holo" />
	
    <!-- 放名字 -->
    <TextView
        android:id="@+id/textView1"
        android:layout_width="480px"
        android:layout_height="120px"
        android:text="TextView" />
	
    <!-- 放年龄 -->
    <TextView
        android:id="@+id/textView2"
        android:layout_width="480px"
        android:layout_height="120px"
        android:text="TextView" />

</LinearLayout>

第四步:创建Adapter

package com.example.adapter;

import java.util.List;

import org.w3c.dom.Text;

import com.example.entity.Users;
import com.example.testloadimage.R;
import com.example.testloadimage.R.layout;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/*
 * 自定义的Adapter填充器,定义的是用什么样式来填充内容,用来被填充器方法继承
 */
public class MyAdapter extends BaseAdapter{
	//上下文
	private Context context;
	//json解析的信息对象
	private List<Users> lt;
	//解析后的图片名下载成对应的图片
	private List<Bitmap> bits;

	//构造方法,调用这个类型的填充器必须传入三个必须的参数
	public MyAdapter(Context context, List<Users> lt, List<Bitmap> bits) {
		super();
		this.context = context;
		this.lt = lt;
		this.bits = bits;
	}
	//继承BaseAdapter自动生成的四个方法
	//一共需要填充几行信息,这个由传过来的lt数组长度来决定
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return lt.size();
	}
	//每个下表显示的是后台的那个信息:也可以说是每个下标的内容是什么
	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return lt.get(position);
	}
	//对应的每个下标
	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}
	//最关键的方法,查找视图样式,然后把内容绑定到样式控件里面,然后在显示在listview中
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		//布局加载器,需要上下文,Android没有上下文什么都做不了
		LayoutInflater inflater = LayoutInflater.from(context);
		//用布局加载器获取对应的视图,不过需要给视图id
		View view = inflater.inflate(R.layout.title, null);
		
		//获得样式视图以后,就可以获取对应的控件TextView和ImageView
		TextView nameText = (TextView)view.findViewById(R.id.textView1);
		TextView ageText = (TextView)view.findViewById(R.id.textView2);
		ImageView tupain = (ImageView)view.findViewById(R.id.imageView1);
		
		//即使获得了控件,但是信息还没有绑定进入,所以还要把text和image绑定入控件
		nameText.setText(lt.get(position).getName());
		ageText.setText(""+lt.get(position).getAge());
		//这里的是图片bitmap集合,也是三个参数之一
		tupain.setImageBitmap(bits.get(position));
		
		//返回的是整个样式
		return view;
		
		
	}
	
}

第五步:servlet的json文件

[{"id":1,"name":"jin","age":22,"tupian":"jin1.jpg"},
{"id":2,"name":"qian","age":25,"tupian":"jin2.jpg"}]

第六步:配置网络权限和视图绑定

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testloadimage"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="22" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <!-- <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> -->
        </activity>
        
        <activity
            android:name=".TestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
<!-- 添加位置只要在< application>标签外面就可以了 -->
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

猜你喜欢

转载自blog.csdn.net/jinqianwang/article/details/82528231
今日推荐