Архитектура локального сервиса Android - PullRequest
0 голосов
/ 09 июня 2011

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

Вот мой класс обслуживания

public class BgService extends Service {
    private static final String TAG = BgService.class.getSimpleName();
    private Timer timer;
    SendJsonRequest sjr;

    private TimerTask updateTask = new TimerTask(){
        @Override
        public void run(){
            try{
                SendJsonRequest sjr = new SendJsonRequest();
                sjr.carMake();
                Log.i(TAG, "LOOK AT ME");
            }
            catch(Exception e){
                Log.w(TAG,e);
            }
        }
    };
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onCreate(){
        super.onCreate();
        Log.i(TAG, "Service creating");
        timer = new Timer("Server listening timer");
        timer.schedule(updateTask, 1000L, 60*1000L);
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.i(TAG, "Service Destroying");
        timer.cancel();
        timer = null;
    }
}

Вот мой класс SendJsonRequest

public class SendJsonRequest{
         private static final String TAG = "SendJsonRequest";
         private static String URL = "xxxxxxxxx";
         private static String infoRec;

         public static void createJsonObj(String path, Map x){
             infoRec = CreateJsonRequest.jsonRequest(URL+path, x );
             System.out.println(infoRec);
         }
         public static void carMake(){
             String path = "/CarMake";
             Map<String, Object> z = new HashMap<String,Object>();
             z.put("Name", "Ford");
             z.put("Model", "Mustang");
             createJsonObj(path, z);
         }

        }

Вот мойCreateJsonObject class

public class CreateJsonRequest {
    public static String jsonRequest(String URL, Map<String,Object> params){
        try{
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(URL);

            JSONObject holder = new JSONObject();

            for (Map.Entry<String, Object> m : params.entrySet()){
                try {
                    holder.put(m.getKey(), m.getValue());
                }
                catch (JSONException e) {
                    Log.e("Hmmmm", "JSONException : "+e);
                }
            }   
            StringEntity se;
            se = new StringEntity(holder.toString());

            httpPost.setEntity(se);
            httpPost.setHeader("Accept", "text/json");
            httpPost.setHeader("Content-type", "text/json");

            HttpResponse response = (HttpResponse) httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();

            if(entity != null){
                InputStream is = entity.getContent();
                Header contentEncoding = response.getFirstHeader("Content-Encoding");

                String result= convertToString(is);
                is.close();

                System.out.println(result);
                return result;

            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

Извините за огромный объем кода.Как я реализовал свой сервис, очевидно, не правильно, я просто понятия не имею, с чего начать, чтобы получить сервис, обрабатывающий запросы json к серверу.Заранее спасибо.

Чтобы быть более понятным, это сработало при нажатии кнопки, теперь я пытаюсь заставить его все работать в фоновом режиме с сервисом.Поэтому я думаю, что мой вопрос в том, что происходит в службе?

Моя деятельность успешно запускает службу, служба будет работать и каждую минуту печатать «смотреть на меня» в logcat.Затем я добавил try{ sjr.carMake()}, и он ловит исключение.

1 Ответ

0 голосов
/ 09 июня 2011

Вы можете использовать приемник вещания.Это способ запустить ваш код в определенное время, указанное в ОС Android - например, вы можете запустить его после завершения загрузки Android (здесь я обычно запускаю свои службы.

Лучший способ - этоиспользовать класс AlarmManager и сообщить службе, как часто следует запускать.

Расскажите подробнее о том, что вы пытаетесь сделать, и в чем проблема, и мы можем дать вам более краткий ответ..

ОБНОВЛЕНИЕ:

Вы создали запись в файле manifest.xml для службы?

ОБНОВЛЕНИЕ ЗдесьЭто то, как я делаю это в своем приложении. Это ваш «крючок» к ОС. Он сработает, когда завершит загрузку (для этого не забудьте внести в манифест запись)!

public class TmBroadcastReceiver extends BroadcastReceiver {
 @Override
     public void onReceive(final Context context, final Intent bootintent) {

         try{
             Log.i("Taskmotion-ROBOT", "Robot Broadcast signal received on Boot. Trying to start Alarm scheduler");
              Intent mServiceIntent = new Intent(context, ServiceAlarm.class);
              context.startService(mServiceIntent);

         }
         catch(Exception e)
         {
            Log.i("Taskmotion", "Failed to start service..."); 

         }
     }
}

Этот приемник Broadcast вызывает службу, которая реализует класс AlarmManager. Диспетчер аварийных сигналов устанавливает расписание для запуска моей службы с заданным интервалом. Обратите внимание, что аварийные сигналы удаляются при выключении телефона, но затем воссоздаются снова.В случае повторения процесса, когда телефон загружается и снова запускает BroadcastReceiver.

public class ServiceAlarm extends Service {
 private PendingIntent mAlarmSender;


 @Override
 public void onCreate() {

     try{
         Log.i("Taskmotion-ROBOT", "Setting Service Alarm Step 1");
         mAlarmSender = PendingIntent.getService(this.getApplicationContext(),
                 0, new Intent(this.getApplicationContext(), BackgroundService.class), 0);
     }
     catch(Exception e)
     {
         Log.i("Taskmotion-ROBOT", "Problem at 1 :" + e.toString());

     }

     long firstTime = SystemClock.elapsedRealtime();

     Log.i("Taskmotion-ROBOT", "Setting Service Alarm Step 2");
     // Schedule the alarm!
     AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
     am.setRepeating(AlarmManager.ELAPSED_REALTIME,
                     firstTime, AlarmManager.INTERVAL_HOUR, mAlarmSender);

     this.stopSelf();


 }



@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}


}

Я еще не рефакторинг этого кода, это был мой первый опыт.Теперь я вижу, что смотрю на это снова, что я, вероятно, мог бы выполнять планирование внутри BroadcastReceiver, но ради получения чего-то, что работает, я продолжу.

Как указано AlarmManager.INTERVAL_HOURМой сервис будет работать один раз в час.Служба, которую я хочу запустить, определена в pendingIntent (BackgroundService.class).Это где вы положили свой собственный класс обслуживания.Я переделал ваш класс обслуживания для вас и удалил таймер (функциональность заменена на BroadcastReceiver & AlarmManager).

public class BgService extends Service {
    private static final String TAG = BgService.class.getSimpleName();
    SendJsonRequest sjr;


    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onCreate(){
        super.onCreate();
        Log.i(TAG, "Service creating");


//DO YOUR WORK WITH YOUR JSON CLASS HERE
//**************************************

//Make sure to call stopSelf() or your service will run in the background, chewing up
//battery life like rocky mountain oysters!
this.stopSelf();


    }

    @Override
    public void onDestroy(){
        super.onDestroy();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...