2011-06-02 8 views
1

私は大学のプロジェクトとしてタスクスケジューラアプリケーションで作業しています。タスクの有効期限をチェックするサービスがあります。私は、有効期限をチェックするハンドラを実装していました。アプリケーションの有効期限が現在の時刻と一致すると、ステータスバーの通知が送信されます。この時点で私は1分Thread.Sleepメソッドを使用してスレッドを一時停止しているので、アプリケーションがハングしています。 logcatでは、アプリケーションによるCPU使用量が大きくなります。サービスでハンドラとスレッドを処理すると、Thread.sleepはプログラムをハングさせますか?

データベースからデータを取得していますが、Thread.sleepが呼び出されていないと正常に動作します。 助けてください。ここで

コードです:あなたがここにHandlerpostDelayed機能を使用している場合は

package com.apps.niit.taskm; 
import java.util.ArrayList; 
import java.util.Calendar; 

import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.IBinder; 
import android.util.Log; 


public class ExpireTimeService extends Service { 

    DataHelper dh; 
    ArrayList<String> tData=new ArrayList<String>(); 
    String date; 
    Calendar c; 
    String str; 
    String str1; 
    String str2; 
    String str3; 
    String str4; 
    String str5; 
    int notificationID=1; 
    String [][] data; 
    NotificationManager notificationManager; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     dh = new DataHelper(this); 
     fetchData(); 
     handler.removeCallbacks(updateTimeTask); 
     handler.postDelayed(updateTimeTask, 1000); 
    } 
    public void fetchData(){ 
     String eDate = android.text.format.DateFormat.format("d/M/yyyy", new java.util.Date()).toString(); 
     tData.addAll(this.dh.selectDate(eDate)); 
     data =new String[tData.size()][4]; 
     if(!tData.isEmpty()){ 
      for(int i=0; i<tData.size();i++){ 
       breakString(tData.get(i)); 
       data[i][0]=str1; 
       data[i][1]=str2; 
       data[i][2]=str3; 
       data[i][3]=str4; 
      } 
     } 
    } 

    public void stopService(){ 
     stopSelf(); 
    } 
    private Runnable updateTimeTask = new Runnable() { 
     public void run(){ 
      try { 
       String time = android.text.format.DateFormat.format("k:m", new java.util.Date()).toString(); 

       for(int i=0; i<tData.size();i++){ 
        if(data[i][3].equals(time)){ 
        //send notification code goes here 
         String serName = Context.NOTIFICATION_SERVICE; 
         notificationManager = (NotificationManager)getSystemService(serName);    
         String ticker= data[i][0]+" "+data[i][1]+" "+data[i][2]+" "+data[i][3]; 
         long when= System.currentTimeMillis(); 
         int icon = R.drawable.icon; 
         Notification notification = new Notification(icon, ticker,when); 
         Intent intent = new Intent (getApplicationContext(), DisplayTask.class); 
         Bundle myBundle = new Bundle();  
         myBundle.putString("str1", data[i][0]); 
         myBundle.putString("str2", data[i][1]);Log.i("data1",data[i][1]); 
         myBundle.putString("str3", data[i][2]);Log.i("data1",data[i][2]); 
         myBundle.putString("str4", data[i][3]);Log.i("data1",data[i][3]); 
         intent.putExtras(myBundle); 
         PendingIntent launchIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); 
         notification.setLatestEventInfo(getApplicationContext(), "", "", launchIntent); 
         notificationID=1; 
         notificationManager.notify(notificationID, notification); 
         Thread.sleep(10000);      
        } 
       } 
       handler.postDelayed(this, 1000); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       Log.e("Error from service", e.toString()); 
      } 
     }  
    }; 

    private void breakString(String str) { 
     // TODO Auto-generated method stub 
     str1 = str.substring(0, str.indexOf(";")); 
     str = str.substring(str1.length()+1, str.length()); 
     str2 = str.substring(0, str.indexOf(";")); 
     str = str.substring(str2.length()+1, str.length()); 
     str3 = str.substring(0, str.indexOf(";")); 
     str4 = str.substring(str3.length()+1, str.length()); 
    } 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (handler != null) 
      handler.removeCallbacks(updateTimeTask); 
     handler = null; 
    } 
    private Handler handler = new Handler(); 
} 

答えて

2

何が起こるかです:

  1. ハンドラは、現在のスレッドのルーパーキューにあなたのRunnableを置きます。
  2. 時間が来ると、Runnableのコードは、のUIスレッドで実行されます。

Handlerは、常にRunnableをUIスレッドキューに入れます。それはRunnable現在のスレッドのキューを置き、あなたの現在のスレッドはUIスレッドでした。

updateTimeTaskには、Thread.sleepや何か時間がかかる(ネットワーク通信のような)ものを置くと、UIスレッド全体がハングします。

ScheduledExecutorServicescheduleWithFixedDelay機能を参照)を使用する必要があります。代わりに、updateTimeTask機能からAsyncTaskを開始して、すべてのdoInBackgrund機能で重い持ち上げを行うことができます。

+0

問題は、handler.postDelayed(

+0

この問題のもう1つの解決方法は、hh:mm:ss形式の一致時間です –

関連する問題