使用ImageLoader获取图片,使用异步在网上请求json,然后解析,在listview中显示出来

来源:互联网 发布:大宗交易数据 编辑:程序博客网 时间:2024/05/17 08:01

1.首先先自己定义一个MyApplication,里面写上上图片显示的配置

package com.example.weekone2;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;import android.app.Application;public class MyApplication extends Application{@Overridepublic void onCreate() {//初始化ImageLoader//步骤1:初始化一个默认的图片显示配置DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_launcher).displayer(new FadeInBitmapDisplayer(3000)).build();//步骤2:初始化config配置//如果使用默认的 直接用静态方法创建   如果要自己添加配置 那么需要new一个configs对象ImageLoaderConfiguration configs = new ImageLoaderConfiguration.Builder(this).threadPoolSize(4).memoryCacheExtraOptions(480, 800).defaultDisplayImageOptions(options).build();//初始化ImageLoader.getInstance().init(configs);super.onCreate();}}

2.创建完MyApplication然后在AndroidManifest.xml中加上权限


<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.weekone2"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="14"        android:targetSdkVersion="21" />        <uses-permission android:name="android.permission.INTERNET"/>    <application        android:name="com.example.weekone2.MyApplication"        android:allowBackup="true"        android:icon="@drawable/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>    </application></manifest>

3.最后在MainActivity中开始写,使用异步从网上请求数据获取图片和json解析 在listview中展示出来。

package com.example.weekone2;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import com.example.weekone2.bean.NewsData;import com.google.gson.Gson;import com.nostra13.universalimageloader.core.ImageLoader;public class MainActivity extends Activity {ListView lv;NewsData nd;MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                lv = (ListView) findViewById(R.id.lv);        initData();        adapter = new MyAdapter();        lv.setAdapter(adapter);    }        class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {if(nd != null){return nd.getData().size();}return 0;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder ;if(convertView == null){convertView = View.inflate(MainActivity.this, R.layout.list_item, null);holder = new ViewHolder();holder.tv_summary = (TextView) convertView.findViewById(R.id.tv_summary);holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);holder.iv = (ImageView) convertView.findViewById(R.id.iv);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}holder.tv_title.setText(nd.getData().get(position).getNews_title());holder.tv_summary.setText(nd.getData().get(position).getNews_summary());//昨天的实现方式是   在getView方法创 创建一个线程  通过把请求的图片输入流转换成bitmap对象的方式设置在iv控件上//今天  使用ImageLoaderImageLoader.getInstance().displayImage(nd.getData().get(position).getPic_url(), holder.iv);return convertView;}        }        public static class ViewHolder{    TextView tv_title,tv_summary;    ImageView iv;    }    private void initData() {new AsyncTask<String, String, NewsData>(){//子线程方法   后台方法@Overrideprotected NewsData doInBackground(String... params) {//发起网络请求获取数据InputStreamReader isr = getData();Gson gson = new Gson();nd = gson.fromJson(isr, NewsData.class);return nd;}//主线程方法   在doInBackground返回以后调用@Overrideprotected void onPostExecute(NewsData result) {adapter.notifyDataSetChanged();super.onPostExecute(result);}}.execute();}protected InputStreamReader getData() {InputStreamReader isr = null;try {URL url = new URL("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");int code = conn.getResponseCode();if(code == 200){//请求成功  使用输出输出流  来处理数据//方式一//1、把数据流中的数据循环读入到  ByteArrayOutputStream输出流中//2、把ByteArrayOutputStream输出流中的数据 转换成字符串//3、把这个字符串返回//InputStream is = conn.getInputStream();//ByteArrayOutputStream bos = new ByteArrayOutputStream();//int len = -1;//byte[] buff = new byte[1024];//while((len = is.read(buff)) != -1){//bos.write(buff, 0, len);//}//String result = new String(bos.toByteArray());//方式二//1、把数据的  字节输入流 转换成  字符输入流//2、返回该字符输出流InputStream is = conn.getInputStream();isr = new InputStreamReader(is);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return isr;}}


阅读全文
0 0
原创粉丝点击