在網路上查過之後才發現原來 Android 為了怕開發者將 HTTP 傳送請求放在主程式中,如果 HTTP 這個要求一直持續的話很有可能會卡死整個程式,造成應用程式的 crash 因此 Android 非常貼心的幫助開發者判斷 httpRequest 這個方法是否是在主程式中運行,如果是的話便會拋出錯誤
而如果想要解決這問題就是要將 httpRequest 寫在多執行緒中,以下是其中一種解法
public class MainActivity extends Activity{
private EditText txtMessage;
private Button sendBtn;
private String uriAPI = "你要傳送要求的網址";
String msg = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtMessage = (EditText) findViewById(R.id.txt_message);
sendBtn = (Button) findViewById(R.id.send_btn);
sendBtn.setOnClickListener(sendlistener);
}
private Runnable mutiThread = new Runnable(){
public void run(){
// 運行網路連線的程式
msg = txtMessage.getEditableText().toString();
String r = sendPostDataToInternet(msg);
if (r != null)
Log.d("first0.0", r);
}
};
public OnClickListener sendlistener = new OnClickListener(){
public void onClick(View v){
if (v == sendBtn){
if (txtMessage != null){
/*
* 這邊要用 Thread 是因為 Android 改版之後
* 會對在主程式裡跑網路連接的程式碼做 Exception 的意外排除動作
* 因此要把網路連線使用多執行緒的方式去運行,才不會被當成例外錯誤拋出
*/
Thread thread = new Thread(mutiThread);
thread.start();
}
}
}
};
private String sendPostDataToInternet(String strTxt){
/* HTTP Post */
HttpPost httpRequest = new HttpPost(uriAPI);
/* 將 Post 值存為一個 NameValuePair[],在這邊去添加自己想要的值 */
List params = new ArrayList();
params.add(new BasicNameValuePair("APIMethod", "phoneTest"));
/* 這邊 PHP 端的接法就是用 $_POST['data']就接的到這邊的 strTxt 這個變數值了 */
try{
/* 設定 HTTP request */
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
/* 傳送 HTTP response */
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
/* 如果回傳值為 200 即為傳送 ok */
if (httpResponse.getStatusLine().getStatusCode() == 200){
/* 接收回傳字串,這邊接的值就是在 PHP 那邊 echo 的值 */
/* hellow.php 這隻程式碼的寫法:
* if($_POST['data']!=null) echo $_POST['data']; */
String strResult = EntityUtils.toString(httpResponse.getEntity());
return strResult;
}
else{
Log.d("sss", "no message");
}
} catch (ClientProtocolException e){
Log.d("@@", e.toString());
} catch (IOException e){
Log.d("@@", e.toString());
} catch (Exception e){
Log.d("@@", e.toString());
}
return null;
}
}
謝謝
回覆刪除十分感謝!
回覆刪除