Я пытаюсь отправлять уведомления каждый час, но хочу заполнять из базы данных, у меня есть рабочий код, но не до одного часа для следующего уведомления

#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:

Я бы рассмотрел возможность использования службы исполнителя, если только я не неправильно понял ваши требования.

Отправка ваших исполняемых файлов исполнителю позволила бы вам планировать выполнение ежечасно, и вы могли бы гарантировать время выполнения, независимо от того, сколько времени заняло предыдущее выполнение, что, вероятно, было бы проблемой с вашей текущей реализацией.