異步操作之handler+message

轉發請註明出處:http://blog.csdn.net/qq_28055429/article/details/51941385

一,Handler:

(1)解釋:處理者,即消息傳遞機制

(2)基本方法:

 void handleMessage(Message msg):處理消息,經常使用此方法

Message obtainMessage():獲取消息


以下幾個方法均以final boolean 開頭:

sendEmptyMessage(int what):發送空消息

sendEmptyMessageDelayed(int what , long delayMills):指定多少毫秒後發送空消息

 sendMessage(Message msg):立即發送消息 ,常用此方法

sendMessageDelayed(Message msg , long delayMillis):指定多少毫秒後發送消息

 hasMessages(int what):檢查消息隊列中是否包含what屬性爲指定值的消息

 hasMessages(int what , Object object):檢查消息隊列中是否包含屬性值what,object屬性爲指定對象的消息


(3)兩個常用作用:

----在新啓動的線程中發送消息

------在主線程中獲取,處理消息

(4)相關聯:Message,Loop,MessageQueue,

Message:Handler接收和處理的消息對象,其相關參數有:

--- arg1和arg2 :用來存放整型數據的;

----- what :用來保存消息標示的;

-----  obj :是Object類型的任意對象;

-----  replyTo :是消息管理器,會關聯到一個handler

Looper :每個線程只能有一個Looper,其loop方法負責讀取MessageQueue中的消息,然後發給Handler處理

MessageQueue:消息隊列,採用先進先出來存儲管理Message


二,Handler和Message的一般處理步驟(Loop ,MessageQueue暫時不探討)

(1)創建Handler對象,可以採用繼承Handler的方法,也可以採用new Handler方法,如下:

   public class ImageHandle extends Handler{};

  或  private Handler handler = new Handler(){}

(2)重寫其handleMessage(Message msg)方法,根據傳回來的Message對象去處理

(3)在需要的地方,創建Message對象,並設置其相關參數,再調用handler.sendMessage(message)發送消息給Handler處理

  如:

Message message = new Message();
        message.what = i ;
        handler.sendMessage(message);

(4)然後handler就去處理了,,

三,3個例子:


例子(1):從網絡上加載圖片,然後顯示出來:

佈局文件:activity_third:採用ScrollView佈局,放置一個LinearLayout(裏面放置3個ImageView,用於顯示網上圖片)

<?xml version="1.0" encoding="utf-8"?>
<!--定義頁面的基本佈局:滾動佈局-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--在滾動佈局中加入線性佈局-->
    <LinearLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        android:background="@color/skyblue"
        android:orientation="vertical">
        <!--加入圖片控件1和3-->
        <ImageView
            android:id="@+id/Iv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:id="@+id/Iv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:id="@+id/Iv3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</ScrollView>


異步類:ImageHandle:繼承自Handler,重寫hanldeMessage方法,在裏面執行相關操作,代碼如下:

package testsdcard.com.maiyu.s04_71.activity.handle;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

import java.net.URL;

/**
 * Created by maiyu on 2016/7/16.
 */
public class ImageHandle extends Handler {
    Activity context ;  //定義Activity的上下文對象

    public ImageHandle(Activity context){
        this.context = context;
    }

    //接收thread發送過來的mesage信息
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        //從message信息中得到從網絡請求下來的圖片信息,並設置到imageView對象上
        ImageView img = (ImageView)context.findViewById(msg.arg1);
        img.setImageDrawable((Drawable)msg.obj);
    }

    //讀取網絡圖片的函數,第一個參數爲網絡圖片的url,第二個圖片爲需要設置的圖片控件的id
    public void loadImg(final  String imgUrl , final int viewId){
        //建立一個線程
        Thread  thread  =  new Thread(){
            @Override
            public void run() {
                try{
                    //讀取網絡上的圖片
                    Drawable    drawable    =   Drawable.createFromStream(new URL(imgUrl).
                            openStream() , "img.png");

                    //定義Message對象
                    Message  msg = ImageHandle.this.obtainMessage();
                    //設置Message對象的參數
                    msg.arg1  =  viewId ;
                    msg.obj   =  drawable ;
                    //調用handle的sendMessage函數
                    ImageHandle.this.sendMessage(msg);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        };
        //啓動線程
        thread.start();
        thread = null ;

    }
}
測試類:ThirdActivity:繼承Activity,調用ImageHandle的loadImg方法,即可,代碼如下:

package testsdcard.com.maiyu.s04_71.activity;

import android.app.Activity;
import android.os.Bundle;

import testsdcard.com.maiyu.s04_71.R;
import testsdcard.com.maiyu.s04_71.activity.handle.ImageHandle;

/**
 * Created by maiyu on 2016/7/16.
 */
public class ThirdActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        //開啓一個加載圖片的handler,設置Iv1的圖片
        ImageHandle  imageHandle1 = new ImageHandle(this);
        imageHandle1.loadImg("http://p0.so.qhimg.com/t01acc71e1e343e5f1a.jpg" ,R.id.Iv1);

        //開啓一個加載圖片的handler,設置Iv2的圖片
        ImageHandle  imageHandle2 = new ImageHandle(this);
        imageHandle2.loadImg("http://www.it.com.cn/games/image/news/2009/12/03/16/jr1203ldd03.jpg", R.id.Iv2);

        //開啓一個加載圖片的handler,設置Iv3的圖片
        ImageHandle  imageHandle3 = new ImageHandle(this);
        imageHandle3.loadImg("http://p2.so.qhimg.com/t0178e98dcb5581fa7c.jpg" , R.id.Iv3);
    }
}


添加網絡權限:
 <uses-permission android:name="android.permission.INTERNET"></uses-permission>



結果:輸出3個圖片,可以滾動的,,,,圖略



例子(2):從網絡下載文件存到本地sdcard,可中斷,同樣利用handler + message

佈局:activity_five:一個textView,一個editText,兩個button(開始與結束),一個進度條

<?xml version="1.0" encoding="utf-8"?>
<!--定義基本佈局:LinearLayout-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!--一個TextView-->
    <TextView
        android:id="@+id/Tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/five_tv"/>
    <!--輸入框-->
    <EditText
        android:id="@+id/Et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/five_et"/>
    <!--兩個按鈕:開始與停止-->
    <Button
        android:id="@+id/BtnStart"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/five_btn1"/>
    <Button
        android:id="@+id/BtnStop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/five_btn2"/>
    <!--進度條-->
    <ProgressBar
        android:id="@+id/Pb"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"/>

</LinearLayout>


strings的內容:

  <string name="button5">文件下載存入sdcard</string>
    <string name="five_tv">請輸入下載地址</string>
    <string name="five_et">http://p1.so.qhimg.com/t0127d1282a580df751.jpg</string>
    <string name="five_btn1">開始下載</string>
    <string name="five_btn2">停止下載</string>



主類(都寫在一起了):FiveActivity,實現handler和messge的操作,代碼如下:

package testsdcard.com.maiyu.s04_79.activity;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import testsdcard.com.maiyu.s04_79.R;

/**
 * Created by maiyu on 2016/7/18.
 */
public class FiveActivity extends Activity {
    private ProgressBar pb ;        //定義進度條
    private TextView tv ;           //文本框和編輯框和兩個按鈕
    private EditText et ;
    private Button btnstart , btnstop ;
    private int fileSize , downLoadFileSize ;   //文件大小和已經下載的文件的大小
    private String filename ;       //文件名字
    private Thread thread ;         //線程對象

    //處理其他線程message的hanlder對象,根據message傳來的數據去處理
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //如果線程沒有終止
            if(!Thread.currentThread().isInterrupted()){
                switch (msg.what){
                    //發送0--設置進度條總長,不用break繼續判斷
                    case 0 :
                        pb.setMax(fileSize);
                        //1--文件正在下載
                    case 1 :
                        pb.setProgress(downLoadFileSize);       //設置進度
                        int result = downLoadFileSize * 100 /fileSize ; //百分比
                        tv.setText(result + "%");
                        break;
                    case 2 :        //2---下載完畢
                        Toast.makeText(FiveActivity.this , "文件已下載完畢,請在sdcard下查看", Toast.LENGTH_SHORT).show();
                        break;
                    case 3 :        //下載被停止了
                        Toast.makeText(FiveActivity.this , "文件已停止下載" ,Toast.LENGTH_SHORT).show();
                        pb.setProgress(0);
                        tv.setText("0%");
                        break;
                    case -1 :       //-1---下載出錯
                        String error = msg.getData().getString("error");
                        Toast.makeText(FiveActivity.this , error , Toast.LENGTH_SHORT).show();
                        break;
                }
            }

            super.handleMessage(msg);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_five);
        findView();     //綁定id
        setListener();  //設置監聽
    }

    //爲兩個按鈕設置監聽器
    private void setListener() {
        btnstart.setOnClickListener(mylistener);    //mylistener爲自定義監聽器
        btnstop.setOnClickListener(mylistener);
    }

    //自定義監聽器
    View.OnClickListener  mylistener    =   new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.BtnStart :
                    //新開一個線程開始下載文件
                    thread  =   new Thread(){
                        @Override
                        public void run() {
                            try{
                                //得到下載地址
                                String str = et.getText().toString();
                                down_file(str , "/sdcard/");        //調用自定義方法down_file:存儲在sdcard目錄下
                                //down_file(str);
                            }catch (Exception e){
                                e.printStackTrace();
                            }
                            //super.run();
                        }
                    };
                    thread.start();     //啓動線程
                    break;
                case R.id.BtnStop :
                    thread.interrupt();     //中斷線程
                    break;
                default :
                    break;
            }
        }
    };

    //爲各個控件綁定id
    private void findView() {
        pb  =   (ProgressBar)findViewById(R.id.Pb);
        tv  =   (TextView)findViewById(R.id.Tv);
        et  =   (EditText)findViewById(R.id.Et);
        btnstart    =   (Button)findViewById(R.id.BtnStart);
        btnstop     =   (Button)findViewById(R.id.BtnStop);
    }

    //根據url下載文件,保存在path下
    public void down_file(String url ,String path) throws IOException{
        filename    =   url.substring(url.lastIndexOf("/") + 1);    //得到文件名字
        URL  mURL   =   new URL(url);                       //創建URL
        URLConnection  conn  =  mURL.openConnection();      //得到URLConnection對象
        conn.connect();                                     //連接URLConnectioin
        InputStream  is  =  conn.getInputStream() ;         //得到輸入流
        fileSize    =  conn.getContentLength() ;            //獲取文件大小
        if(fileSize <= 0){
            throw new RuntimeException("文件無法獲知大小");
        }
        if(is == null){
            throw new RuntimeException("數據流爲空的");
        }

        //定義本地文件的讀取流對象
        FileOutputStream  fos = new FileOutputStream(path + filename);
        //FileOutputStream  fos = new FileOutputStream(  Environment.getExternalStorageDirectory()+filename);

        byte buf[] = new byte[1024];        //byte[]數組,每次讀取大小
        downLoadFileSize = 0 ;              //初始化
        sendMsg(0);                         //設置總的進度條
        do{
            int numread = is.read(buf);     //循環讀取
            if(Thread.currentThread().isInterrupted()){
                sendMsg(3);     //中斷時
                try{
                    is.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
                return;
            }
            if(numread == -1){      //完畢時退出循環
                break;
            }
            fos.write(buf , 0 , numread);       //寫入
            downLoadFileSize += numread ;
            sendMsg(1);                 //更新進度
        }while (true);
        sendMsg(2);         //下載完畢
        try{
            is.close();         //關閉流
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //從子線程發送message給主線程
    private void sendMsg(int i) {
        Message message = new Message();
        message.what = i ;
        handler.sendMessage(message);
    }
}


記得添加權限:

分別是:訪問網絡權限;往sdcard寫入權限;在sdcard下創建和刪除權限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>



如何,去sdcard目錄下,查看,發現剛剛下載的東西已經存在了


例子(3),足球明星圖片和名字和簡介網上加載:(C羅,梅西,納尼)

佈局:有兩個

第一個:activity_second.xml放置一個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">
    <!--定義列表佈局ListView-->
    <ListView
        android:id="@+id/Lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
第二個:listview_second.xml:定義listView的每一個子項的內容格式,一個ImageView,兩個TextView(名字和簡介),代碼:

<?xml version="1.0" encoding="utf-8"?>
<!--定義GridView的item的佈局文件-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="40dp">
    <!--item的圖片控件-->
    <ImageView
        android:id="@+id/ItemIv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"/>
    <!--item的姓名文字控件-->
    <TextView
        android:id="@+id/ItemTvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/ItemIv"/>
    <!--item的簡介文字控件-->
    <TextView
        android:id="@+id/ItemTvInfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/ItemIv"/>

</RelativeLayout>
一個佔位符類,類似於自定義適配器裏的ViewHolder內部類(佔位符):

ViewCache2---------- 主要定義剛剛佈局的ImageView,2個TextView找到id

代碼:

package testsdcard.com.maiyu.s04_79.domain;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import testsdcard.com.maiyu.s04_79.R;

/**定義視圖的佔位符類
 * Created by maiyu on 2016/7/17.
 */
public class ViewCache2 {
    private View baseView ;   //定義基本視圖對象
    private TextView textViewname , textViewinfo ;  //定義要顯示的標題,圖片,信息
    private ImageView imageView ;

    //初始化基本視圖
    public ViewCache2(View baseView){
        this.baseView = baseView ;
    }
    //3個get方法,分別得到圖片,標題,信息
    public TextView getTextViewname(){
        if(textViewname == null){
            textViewname    =   (TextView)baseView.findViewById(R.id.ItemTvName);
        }
        return  textViewname ;
    }
    public TextView getTextViewinfo(){
        if(textViewinfo == null){
            textViewinfo    =   (TextView)baseView.findViewById(R.id.ItemTvInfo);
        }
        return  textViewinfo;
    }
    public ImageView getImageView(){
        if(imageView == null){
            imageView   =   (ImageView)baseView.findViewById(R.id.ItemIv);
        }
        return imageView ;
    }
}


一個異步圖片加載類AsyncImageLoader2:

用HashMap<String , SoftReference<Drawable>> imageCache; 來存儲緩存圖片,再次加載此圖片時,無需從網上加載,

其中String代表網址,判斷該imageCache是否已經存有String這個網址了,有就用本地的緩存圖片,無就網上加載

代碼:if( imageCache.containsKey(imageUrl) ){//設置代碼}

完整代碼如下:

package testsdcard.com.maiyu.s04_79.domain;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;

import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;

/**定義異步加載圖片類
 * Created by maiyu on 2016/7/17.
 */
public class AsyncImageLoader2 {
    //定義異步加載圖片的緩存哈希圖
    private HashMap<String ,SoftReference<Drawable>> imageCache ;
    public AsyncImageLoader2(){
        imageCache = new HashMap<String ,SoftReference<Drawable>>();
    }

    //獲取圖片的方法
    public Drawable loadDrawable(final  String imageUrl , final  ImageCallback imageCallback){

        //判斷圖片緩存中是否已經有此圖片,有則返回
        if(imageCache.containsKey(imageUrl)){
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            Drawable  drawable = softReference.get();
            if(drawable != null){
                return drawable ;
            }
        }

        //定義handler對象來發送message
        final Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                imageCallback.imageLoaded((Drawable)msg.obj , imageUrl);
                //super.handleMessage(msg);
            }
        };

        //定義一個新的線程用來讀取網絡上的圖片地址
        new Thread(){
            @Override
            public void run() {
                //讀取圖片地址imageUrl
                Drawable drawable = loadImageFromUrl(imageUrl);
                //將圖片讀取到的地址添加到緩存列表中
                imageCache.put(imageUrl , new SoftReference<Drawable>(drawable));
                //定義message對象,設置內容爲加載到的圖片對象
                Message message = handler.obtainMessage(0 , drawable);
                //發送圖片
                handler.sendMessage(message);
              //  super.run();
            }
        }.start();
        return  null ;
    }

    //從圖片地址讀取圖片
    public  static  Drawable loadImageFromUrl(String url){
        URL m ;
        InputStream i = null ;      //定義url對象,及inputstream對象
        try{
            //通過圖片的url得到圖片的inputStream對象
            m = new URL(url);
            i = (InputStream)m.getContent();
        }catch(Exception e){
            e.printStackTrace();
        }
        //通過inputStream對象得到圖片的Drawable對象
        Drawable d  =   Drawable.createFromStream(i , "src");
        return d ;
    }

    //圖片獲取到後的接口
    public interface ImageCallback{
        public void imageLoaded(Drawable imageDrawable , String imageUrl);
    }
}


自定義適配器,ListViewAdapter:繼承ArrayAdapter<ListItem>,重寫getView()方法,在裏面實現相關代碼,佔位符類已經在之前定了,故而不創建ViewHolder內部類了,代碼如下:

package testsdcard.com.maiyu.s04_79.adapter;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

import testsdcard.com.maiyu.s04_79.R;
import testsdcard.com.maiyu.s04_79.domain.AsyncImageLoader2;
import testsdcard.com.maiyu.s04_79.domain.ViewCache;
import testsdcard.com.maiyu.s04_79.domain.ViewCache2;
import testsdcard.com.maiyu.s04_79.moudle.ListItem;

/**
 * Created by maiyu on 2016/7/17.
 */
public class ListViewAdapter extends ArrayAdapter<ListItem> {
    private ListView listView ;
    //定義異步圖片加載對象
    private AsyncImageLoader2 asyncImageLoader2 ;

    public ListViewAdapter(Context context , List<ListItem> imageAndTexts , ListView listView) {
        super(context, 0 , imageAndTexts);
        //初始化數據
        this.listView = listView ;
        asyncImageLoader2 = new AsyncImageLoader2();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Activity activity = (Activity)getContext() ;

        //讀取GridView的item佈局,讀取griditem.xml佈局
        View rowView = convertView ;
        ViewCache2 viewCache2 ;
        if(rowView == null){
            //讀取griditem.xml爲item的佈局
            LayoutInflater inflater = activity.getLayoutInflater();
            rowView  = inflater.inflate(R.layout.listviewitem_second , null);
            //通過當前的佈局視圖,初始化緩存視圖
            viewCache2 = new ViewCache2(rowView);
            //設置當前視圖的標籤
            rowView.setTag(viewCache2);
        }else{
            viewCache2 = (ViewCache2)rowView.getTag();
        }
        //得到需要顯示的對象
        ListItem imageAndText = getItem(position);

        //讀取對象的相應內容值
        String imageUrl = imageAndText.getImageUrl();
        ImageView imageView = viewCache2.getImageView() ;
        imageView.setTag(imageUrl);

        //讀取緩存圖片
        Drawable cachedImage = asyncImageLoader2.loadDrawable(imageUrl ,
              new   AsyncImageLoader2.ImageCallback(){

                  @Override
                  public void imageLoaded(Drawable imageDrawable, String imageUrl) {
                      //得到對應的ImageView對象
                      ImageView imageViewByTag = (ImageView)listView.findViewWithTag(imageUrl);
                      //設置圖片控件顯示的圖像
                      if(imageViewByTag != null){
                          imageViewByTag.setImageDrawable(imageDrawable);
                      }
                  }
              });

        //如果緩存圖片爲空,顯示默認圖片
        if(cachedImage == null){
            imageView.setImageResource(R.drawable.ic_launcher);
        }else {
            imageView.setImageDrawable(cachedImage);
        }

        //顯示姓名和簡介
        TextView textViewname = viewCache2.getTextViewname();
        textViewname.setText(imageAndText.getName());
        TextView textViewinfo = viewCache2.getTextViewinfo();
        textViewinfo.setText(imageAndText.getInfo());
        return rowView;
    }
}


測試類:SecondActivity:繼承Activity,綁定listView,添加自定義適配器(添加數據),爲listView設置適配器(根據自定義適配器的構造函數,注意參數),代碼如下:

package testsdcard.com.maiyu.s04_79.activity;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

import testsdcard.com.maiyu.s04_79.R;
import testsdcard.com.maiyu.s04_79.adapter.ListViewAdapter;
import testsdcard.com.maiyu.s04_79.moudle.ListItem;

/**
 * Created by maiyu on 2016/7/17.
 */
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        ListView listView = (ListView)findViewById(R.id.Lv);
        //定義數據list
        List<ListItem> list = new ArrayList<ListItem>();
        //添加數據
        list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
        list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
        list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));
        list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
        list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
        list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));
        list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
        list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
        list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));
        list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
        list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
        list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));

        listView.setAdapter(new ListViewAdapter(this , list , listView));
    }
}


記得添加網絡權限:

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

結果:

出現一張可以下拉的帥氣的C羅,梅西,納尼的簡介表,,,略

四,當然Looper與handler和message,messageQueue淵源很大,且經常在一起,,,待續,,,


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章