1. 程式人生 > >Android兩種方式獲取網路資料

Android兩種方式獲取網路資料

       不得不吐槽一下Android的臃腫,按照一般的Java程式,直接呼叫就好,但是Android還必須開創執行緒,經過內部訊息機制處理後才能與UI互動。

       下面簡單說說這次用Android與網路通訊的步驟吧。

方法一:New Thread 後再使用Handler,在Handler中呼叫。

(1) 新建AccessNetwok類

public class AccessNetwork implements Runnable{
    private String op ;
    private String url;
    private String params;
    private Handler h;         //這麼多私有變數!
    public AccessNetwork(String op, String url, String params,Handler h) {
        super();
        this.op = op;
        this.url = url;
        this.params = params;
        this.h = h;
    }
    @Override
    public void run() {
        Message m = new Message();
        m.what = 0x123;         //自定義訊息型別
        if(op.equals("GET")){
            Log.i("執行", "傳送GET請求");
            m.obj = GetPostUtil.sendGet(url, params);     
           //GetPostUtil為普通Java讀取網路資料類
        }
        if(op.equals("POST")){
            Log.i("執行","傳送POST請求");
            m.obj = GetPostUtil.sendPost(url, params); 
        }
        h.sendMessage(m);
    }

(2)在主檔案onCreate()中初始化一個Handler物件;

data = (TextView)findViewById(R.id.textView_mes); 
handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                if(msg.what==0x123){
                    data.setText(msg.obj.toString());  
                }
            }
        };

(3)為一個Button新增一個事件響應,用於觸發執行將Get到的資料更新到UI中TextView中

private View.OnClickListener myOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
             new Thread(new AccessNetwork("GET",
                     "http://www.baobaostory.cn/api/user/mybaby.aspx",
                     null,
                     handler)).start();
            new DownloadJson(data).execute("http api"); //這裡省去http api地址 
        }
    };


作為一個偽程式設計師,怎能忍受這種繁瑣的呼叫!於是改進了一下,使用AsyncTask。

方法二:使用AsyncTask獲取網路資料

(1)定義類DownloadJson,在類中直接傳入TextView

public class DownloadJson extends AsyncTask<String, Void, String> {
    TextView textView;
    public DownloadJson(TextView tv) {
        textView = tv;
    }

    @Override
    protected String doInBackground(String... url) {
        String str  = null;
        try {
           HttpCommand cmd = new HttpCommand();
            str = cmd.Get_GetData(url[0]);
        } catch (Exception e) {
            e.printStackTrace();
            Log.i("test", e.getMessage());
        }
        return str;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        textView.setText(result);
    }
}

(2)在主檔案的監控中直接使用
 private View.OnClickListener myOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) { 
            new DownloadJson(data).execute("api");  
            //data為TextView的引用
        }
    };