2012-03-31 6 views
1

私はリマインダーのようなものを保存しているアプリケーションにデータベースを持っています。列の1つは、リマインダを「思い出させる」べき時間の文字列表現で、hh:mmのようになります。主な活動の中でスレッドを作成し、定期的にすべてのリマインダを監視し、アラームを設定する時間をチェックします。このスレッドを作成する前に、すべてのデータベース行のID + IDをArrayListにロードし、データベース自体ではなくスレッドでこのArrayListを使用します(これにはいくつかの問題がありました)。とにかく、ここのコードです:Android:特定の時間にスレッドを使用して

まず、私はApplicationクラスを使用してグローバル変数を宣言:

public class MyApplication extends Application { 
    public ArrayList<String> reminders = new ArrayList<String>(); 
    public int hour; 
    public int minute; 
} 

そして、私の主な活動で

public class Home extends Activity { 

    ArrayList<String> reminders; 
    String time: 
    int hour; 
    int minute; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     //The usual code at the beginning of onCreate method 

     //I load my global variables 
     MyApplication appState = ((MyApplication)getApplicationContext()); 
     reminders = appState.reminders; 
     hour = appState.hour; 
     minute = appState.minute; 

     //I save curren time into global variables 
     Calendar c = Calendar.getInstance(); 
     hour = c.get(Calendar.HOUR); 
     minute = c.get(Calendar.MINUTE); 

     //I loop over all rows of database and save what I need from them into 
     //Strings in ArrayList reminders. I do this only once on Application 
     //launch to load already existing rows. When the application runs 
     //I can always add or remove existing rows using special Activity 

     //I create and start my Thread 
     Thread t = new Thread() { 
      try { 
       while (true) { 
        time = hour + ":" + minute; 
        if (reminders.size() > 0) { 
         for (int i = 0; i < reminders.size(); i++) { 
          if (reminders.get(i).contains(time)) { 
           //One of the Strings in ArrayList reminders 
           //contains String representation of current 
           //time (along with the ID of database row). 
           //Here I will probably be starting a new 
           //Activity 
          } 
         } 
        } 
        minute++; 
        if (minute == 60) { 
         minute = 0; 
         hour++; 
        } 
        if (hour == 24) { 
         hour = 0; 
        } 
        sleep(1000); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     t.start(); 
    } 
} 

それが正常に動作しているようだが、このソリューションは本当に不快です。私の最初の質問は、このコードを改善する方法があるかどうかです。スレッド自身に変数int time、int minute、およびArrayListのリマインダを作成し、スレッドループシーケンスの直前にリマインダーの内容をロードするだけでいいですか?この方法では、アプリケーションクラスを使用して変数を格納する必要はありませんが、グローバルにする必要があります。アプリケーションで新しいActivityesを起動してもスレッドが実行されている必要があり、変数を正しく保存する必要があります。

私の2番目の質問私はいくつかの完全に別の方法がある場合は、これにアプローチすることをお勧めします。

ありがとうございました!


私の質問に何かを追加したいのですが、 IllはAlarmManagerを使用しているので、Imは1つ以上のアクティビティで繰り返しイベントを設定する必要があります。だから私の質問は、イベントを追加または削除するために、各アクティビティで異なるAlarmManagerインスタンスを使用するか、グローバルに宣言される同じインスタンスを使用する必要がありますか?ありがとう。

答えて

3

AlarmManagerは、「リマインダー」の表をチェックし、必要に応じてユーザーに警告するなど、定期的にタスクを実行するためのより良い選択肢です。理由は、CPUがスリープ状態になったときにスレッドが実行されないためです。スレッドを起床させたい場合は、WakeLockが必要です。これは電力消費量が多くなります。 AlarmManagerはこれに対して最適化を行います。

第2に、これにはグローバルバールは必要ありません。だから、アプリケーションを拡張しないでください。それは必須ではありません。

+0

wakelockについて知りませんでした。私はAlarmManagerについて知っていましたが、私はPC用のJavaからそれを知っていたので、私はスレッドソリューションを使うことに決めました。とにかく、私は今、AlarmManagerを使用して、ありがとう:) –

関連する問題