Android兩種方式獲取網路資料
阿新 • • 發佈:2019-02-06
不得不吐槽一下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的引用
}
};