直接使用 new URL().openStream() 的方式取用網站資料會被警告 主Thread 可能因5秒鐘的反應時間而剪斷連線
所以我們必須改採其他方式
記得因為用到網路
所以要在 AndroidManifest.xml 增加 permission
<uses-permission android:name="android.permission.INTERNET"/>
1. 使用 Thread, Runnable 跟 Handler
@Override
protected void onCreate(Bundle savedInstanceState) {
................................................................................
try{
//執行 Runnable 的 run()
new Thread(runnable).start();
}catch(Exception e){
}
}
Runnable runnable = new Runnable(){
@Override
public void run() {
try{
URL url = new URL("http://url");
String linestr;
InputStreamReader isr = new InputStreamReader(url.openStream(), "UTF-8");
LineNumberReader lnr = new LineNumberReader(isr);
String ret = "";
while((linestr = lnr.readLine())!=null){
ret += linestr;
}
lnr.close();
isr.close();
//把接收到的 data 裝填進 Bundle, 利用 Message 轉給 Handdler 繼續處理
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("msg",EntityUtils.toString(httpResponse.getEntity()));
msg.setData(bundle);
//把 msg 轉給 Handdler 繼續處理
handler.sendMessage(msg);
}catch(Exception e){
}
}
};
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//接到 msg 取出 data
TextView tv = (TextView)findViewById(R.id.msg);
tv.setText(msg.getData().getString("msg"));
}
};
2. 使用 AsyncTask
@Override
protected void onCreate(Bundle savedInstanceState) {
................................................................................
try{
//執行 Runnable 的 run()
new getMsgTask().execute("http://url");
}catch(Exception e){
}
}
class getMsgTask extends AsyncTask<String, Void , String>{
@Override
//strUrlFile是一個array..可以帶入很多個參數
protected String doInBackground(String... strUrlFile){
String ret = "";
try{
URL url = new URL(strUrlFile[0]);
String linestr;
InputStreamReader isr = new InputStreamReader(url.openStream(), "UTF-8");
LineNumberReader lnr = new LineNumberReader(isr);
while((linestr = lnr.readLine()) != null){
ret += linestr;
}
lnr.close();
isr.close();
}catch(Exception e){
ret = e.toString();
}
return ret;
}
@Override
protected void onPreExecute() {
//在 doInBackground 開始之前的 process
super.onPreExecute();
}
protected void onPostExecute(String result) {
//在 doInBackground 完成以後接續的 process
super.onPostExecute(result);
TextView tv = (TextView)findViewById(R.id.msg);
tv.setText(result);
}
@Override
protected void onProgressUpdate(Void... values) {
//此 method 是在呼叫 publishProgress() 時才會trigger
//配合 progressBar 來使用
super.onProgressUpdate(values);
}
}