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」中執行。

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jiang Ying-Fu 的頭像
    Jiang Ying-Fu

    Jiang Ying-Fu的部落格

    Jiang Ying-Fu 發表在 痞客邦 留言(2) 人氣()