#java #android
#java #Android
Вопрос:
Я хочу создать приложение для уведомлений, которое будет оповещать на основе данных из базы данных, я создал приложение, которое уведомляет, я хочу, чтобы это было каждый час, но уведомление не раньше, чем за час до запуска другого. вот код
Runnable myRunnable = new Runnable(){
@Override
public void run() {
while(true){
try {
runOnUiThread(new Runnable(){
@Override
public void run() {
AsyncDataClass asyncRequestObject = new AsyncDataClass();
asyncRequestObject.execute(serverUrl, email, day, hourToPass);
}
});
counter ;
Thread.sleep(3600000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Here is the trigger code
PendingIntent pendingIntent = PendingIntent.getBroadcast(LoginActivity.this, 0, alarmIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 3600000, pendingIntent);
Находится под onPostExcute из AsyncTask
Runnable myRunnable = new Runnable(){
int counter = 0;
@Override
public void run() {
while(true){
try {
runOnUiThread(new Runnable(){
@Override
public void run() {
AsyncDataClass asyncRequestObject = new AsyncDataClass();
asyncRequestObject.execute(serverUrl, email, day, hourToPass);
}
});
counter ;
Thread.sleep(3600000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
private class AsyncDataClass extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);
HttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpPost httpPost = new HttpPost(params[0]);
String jsonResult = "";
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("email", params[1]));
nameValuePairs.add(new BasicNameValuePair("day", params[2]));
nameValuePairs.add(new BasicNameValuePair("time", params[3]));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Log.v("Passing Data = ", nameValuePairs.toString());
HttpResponse response = httpClient.execute(httpPost);
jsonResult = inputStreamToString(response.getEntity().getContent()).toString();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return jsonResu<
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
System.out.println("Resulted Value: " result);
if(result.equals("") || result == null){
Toast.makeText(LoginActivity.this, "Server connection failed", Toast.LENGTH_LONG).show();
return;
}
int jsonResult = returnParsedJsonObject(result);
JSONObject resGet = null;
try {
resGet = new JSONObject(result);
course_code = resGet.getString("course_code");
course_title = resGet.getString("course_title");
} catch (JSONException e) {
e.printStackTrace();
}
if(jsonResult == 0){
Toast.makeText(LoginActivity.this, "No Notification for this hour", Toast.LENGTH_LONG).show();
return;
}
if(jsonResult == 1){
//Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_LONG).show();
alarmIntent = new Intent(LoginActivity.this, AlarmReceiver.class);
alarmIntent.putExtra("email", email);
alarmIntent.putExtra("time", hourToPass);
alarmIntent.putExtra("day", day);
alarmIntent.putExtra("loguser", loggedUser);
alarmIntent.putExtra("stat", status);
alarmIntent.putExtra("lv", level);
alarmIntent.putExtra("course_code", course_code);
alarmIntent.putExtra("course_title", course_title);
sendBroadcast(alarmIntent);
PendingIntent pendingIntent = PendingIntent.getBroadcast(LoginActivity.this, 0, alarmIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 3600000, pendingIntent);
}
}
Ответ №1:
Вы должны создать Handler
как :
Handler handler = new Handler();
И в конце вашего Runnable()
вызова это : handler.postDelayed(runnable, 1000*60*60);
Рабочий пример может быть :
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
AsyncDataClass asyncRequestObject = new AsyncDataClass();
asyncRequestObject.execute(serverUrl, email, day, hourToPass);
//To repeat it every hour
handler.postDelayed(runnable, 1000*60*60);
}
};
handler.postDelayed(runnable, 1000*60*60); //call this when you want to start doing the work
Комментарии:
1. Я тестировал это, но приложение вообще не уведомляло
2. @Olizy Что ты пробовал? Я протестировал этот код с помощью
Toast
, и он работает, просто скопируйте и вставьте код из моего ответа и добавьтеhandler.postDelayed(runnable, 1000*60*60);
туда, где вы хотите начать подсчет, сначала протестируйте его, например, за 5 секунд, чтобы увидеть, работает ли он у вас.3. @Olizy Каков статус вопроса, решен ли он?
4. если мой ответ помог вам, не стесняйтесь проголосовать и пометить ответ как правильный, в противном случае опубликуйте все, что вам нужно для решения вашей проблемы, и пометьте свой как правильный, чтобы мы сообщили другим людям, что вам помогло: D
Ответ №2:
Я бы рассмотрел возможность использования службы исполнителя, если только я не неправильно понял ваши требования.
Отправка ваших исполняемых файлов исполнителю позволила бы вам планировать выполнение ежечасно, и вы могли бы гарантировать время выполнения, независимо от того, сколько времени заняло предыдущее выполнение, что, вероятно, было бы проблемой с вашей текущей реализацией.