本篇写的是:网络请求图片并无限轮播显示。
MainActivity中的代码片段:
package com.example.zym.stu_01_10; import android.os.Handler; import android.os.Message; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.GridView; import com.example.zym.adapter.MyAdapter; import com.example.zym.entity.GsonData; import com.example.zym.utils.MyTask; import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; /** * 视图的展示类 */ public class MainActivity extends AppCompatActivity { private ViewPager viewPager; private GridView gridView; private List<String> list; private int index = 0; private Handler handler = new Handler(){ @Override //用handleMessage得到消息,并执行其中的任务 public void handleMessage(Message msg) { super.handleMessage(msg); //判断发送的消息 if(msg.what == 0){ if (list!=null){ MyAdapter myAdapter = new MyAdapter(MainActivity.this, list); viewPager.setAdapter(myAdapter); handler.removeMessages(0); } }else { //给ViewPager设置,要展示视图。 viewPager.setCurrentItem(index++); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = findViewById(R.id.viewPager); gridView = findViewById(R.id.gridView); list = new ArrayList<>();//实例化集合 //调用方法,执行操作 MyTask myTask = new MyTask(new MyTask.GetData() { @Override public void getJson(String s) { Gson gson = new Gson(); GsonData gsonData = gson.fromJson(s, GsonData.class); List<GsonData.NewslistBean> newlist = gsonData.getNewslist(); //便利集合拿到里面的图片地址,传给适配器 for (int i = 0; i <newlist.size(); i++) { String picUrl = newlist.get(i).getPicUrl(); Log.e("++++++++++",picUrl); list.add(picUrl); } } }); //执行操作,访问网络是耗时操作,所以用handler延时得到数据。 myTask.execute("http://api.tianapi.com/apple/?key=775eee592fd511d8fd5cbaa042a58a65&num=10"); //发送消息 handler.sendEmptyMessageDelayed(0,1000); //创建线程,实现无线轮播 new Thread(){ @Override public void run() { try { while (true){ sleep(1000); handler.sendEmptyMessage(1); } } catch (Exception e) { e.printStackTrace(); } } }.start(); } }适配器,Adapter中的内容:
package com.example.zym.adapter; import android.content.Context; import android.graphics.Bitmap; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.example.zym.stu_01_10.R; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import java.util.List; /** * Created by Administrator on 2018/1/10 0010. */ public class MyAdapter extends PagerAdapter{ private Context context; private List<String> list; private DisplayImageOptions options; //定义构造方法 public MyAdapter(Context context, List<String> list) { this.context = context; this.list = list; //定义options,方便ImageLoader通过网络访问 options = new DisplayImageOptions.Builder() .cacheInMemory(true)//使用内存缓存 .cacheOnDisk(true)//使用磁盘缓存 .showImageOnLoading(R.mipmap.ic_launcher)//设置正在下载的图片 .showImageForEmptyUri(R.mipmap.ic_launcher)//url为空或请求的资源不存在时 .showImageOnFail(R.mipmap.ic_launcher)//下载失败时显示的图片 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片色彩模式 .imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放模式 .build(); } //放回条目数量,无限轮播,所以返回最大值 @Override public int getCount() { return Integer.MAX_VALUE; } //判断view==object是否相同 @Override public boolean isViewFromObject(View view, Object object) { return view==object; } //创建ImageView控件,并用ImageLoader访问网络,加载图片 @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(context); ImageLoader.getInstance().displayImage(list.get(position%list.size()),imageView,options); //把图片加载到预加载中 container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { //删除,已经展示过的图片 container.removeView((View) object); } }访问数据创建的类MyTask:
package com.example.zym.utils; import android.os.AsyncTask; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * Created by Administrator on 2018/1/11 0011. * 创建类,访问网络数据。 */ public class MyTask extends AsyncTask<String,Void,String>{ private InputStream inputStream; private GetData getData; public MyTask(GetData getData) { this.getData = getData; } @Override protected String doInBackground(String... strings) { try { URL url = new URL(strings[0]); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setReadTimeout(5000); urlConnection.setConnectTimeout(5000); if(urlConnection.getResponseCode() == 200){ inputStream = urlConnection.getInputStream(); }else if (urlConnection.getResponseCode()==301 || urlConnection.getResponseCode()==302){ String newurl = urlConnection.getHeaderField("location"); URL newUrl = new URL(newurl); HttpURLConnection newUrlConnection = (HttpURLConnection)newUrl.openConnection(); newUrlConnection.setRequestMethod("GET"); newUrlConnection.setReadTimeout(5000); newUrlConnection.setConnectTimeout(5000); if(urlConnection.getResponseCode() == 200){ inputStream = newUrlConnection.getInputStream(); } } ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int len = -1; while ((len = inputStream.read(b))!=-1){ outputStream.write(b,0,len); } String s = outputStream.toString(); return s; } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); if(s!=null){ getData.getJson(s); } } public interface GetData{ void getJson(String s); } }Application:
package com.example.zym.application; import android.app.Application; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import java.io.File; /** * Created by Administrator on 2018/1/10 0010. * 只走一次,程序开启的时候执行。别忘了,加一个name属性 */ public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); File cachefile=getExternalCacheDir(); ImageLoaderConfiguration config=new ImageLoaderConfiguration.Builder(this) .memoryCacheExtraOptions(480, 800)//缓存图片最大的长和宽 .threadPoolSize(2)//线程池的数量 .threadPriority(4) .memoryCacheSize(2*1024*1024)//设置内存缓存区大小 .diskCacheSize(20*1024*1024)//设置sd卡缓存区大小 .diskCache(new UnlimitedDiscCache(cachefile))//自定义缓存目录 .writeDebugLogs()//打印日志内容 .diskCacheFileNameGenerator(new Md5FileNameGenerator())//给缓存的文件名进行md5加密处理 .build(); ImageLoader.getInstance().init(config); } }布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.zym.stu_01_10.MainActivity"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="400dp" android:id="@+id/viewPager"> </android.support.v4.view.ViewPager> </LinearLayout>清单文件的配置:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application android:name="com.example.zym.application.MyApplication"