Android4.X版本在安全上有重新調整
若程式執行過久時,會有強制關閉程式的情況出現。
這個「過久」,網路上大多的人是說5秒
但程式明明沒有什麼大問題,理論上只需要不到2秒的時間就可以執行完的程式
依舊會發生這類問題,這時就要去從軟體開發的Log去追了
追來追去後發現到了這一行
The application may be doing too much work on its main thread.
雖然不想改程式,但為了程式可以正常在4.x之上執行
只好下海改了。
改的方法是使用「Thread」,然後搭配「Handler」去承接回傳值。
這個是Android4.0後針對一些需花時間執行的程式,要求要使用「執行緒」的方法去編寫。
請注意下方藍色字體的程式碼,這是解決的方法程式碼。
private static final int GUI_OK = 0x101; //自訂事件ID
private static String ResultMsg = “”; //宣告一變數承接Thread要向外傳的值。
/*
自定OnClick事件
此事件會使用HttpPost向Web取得資料。
*/
private OnClickListener btn_click = new OnClickListener ( ) {
public void onClick ( View v ) {
Thread thread = new Thread() {
@Override
public void run ( ) {
Message msg = new Message ( ) ;
String url = “http://127.0.0.1/login.aspx”;
HttpPost hp = new HttpPost ( url ) ;
List < NameValuePair > params = new ArrayList < NameValuePair > ( ) ;
params.add ( new BasicNameValuePair ( “id” , “Frank”) ) ;
hp.setEntity ( new UrlEncodedFormEntity ( param , HTTP.UTF_8 ) ;
HttpResponse hr = new DefaultHttpClient ( ) . execute ( hp ) ;
String Result = EntityUtils.ToString ( hr.getEntity ( ) ) ;
ResultMsg = Result ; //將接收回來的字串放至 ResultMsg 變數中。
msg.what = GUI_OK ; //設定 Handler 要接收的事件ID
ActivityClassName.this.myMessageHandler.sendMessage ( msg ) ; //送出事件訊息
};
thread.start ( ) ; //啟動執行緒
}
};
/*
自定Handler
所有透過 myMessageHandler.sendMessage 方法的 事件訊息
都會到這集合並至 public void handleMessage ( Message msg ) 中執行
*/
Handler myMessageHandler = new Handler ( ) {
@Override
public void handleMessage ( Message msg ) {
switch ( msg.what )
{
case GUI_OK :
TextView txtmsg = ( TextView ) findViewById ( R.id.txtmsg ) ;
txtmsg.setText ( ResultMsg ) ;
break;
}
}
}
Thread 規定不能使用到Layout畫面上的物件,所以只能透過其他的變數去承接。
以上是簡單的舉例,其他複雜的程式,一樣要使用此方法來解決。
同時盡量把一些需花時間處理的程式,放至「Thread」中執行。
留言列表