Получение координат по таймеру. Как сделать таймер ?

Ответить
andr
Сообщения: 9
Зарегистрирован: 28 окт 2014, 02:40

Получение координат по таймеру. Как сделать таймер ?

Сообщение andr » 09 янв 2015, 14:42

Всем привет!
Делаю приложение, которое раз в определенное время будет получать координаты через GPS/Net.
Уже написал получение координат по нажатию на кнопку.
Как сделать так, чтобы нажав на кнопку, запустился таймер и он раз в минуту обновлял координаты?
Как сам таймер реализовать?

Еще, спрошу сразу, в дальнейшем хочу, чтобы в приложении было две кнопки: одна запускает сервис, который работает в фоне и получает координаты раз в минуту, а другая стопит сервис.
Почитал про сервисы, не особо понял.
Может кто подскажет по этому вопросу еще..

Заранее спасибо!

Аватара пользователя
Ghost.spb
Сообщения: 7
Зарегистрирован: 06 янв 2015, 13:46

Re: Получение координат по таймеру. Как сделать таймер ?

Сообщение Ghost.spb » 10 янв 2015, 13:46

Здесь не заметил ничего про таймеры, а вообще гугл отлично работает ;)
http://developer.alexanderklimov.ru/and ... /timer.php

Про сервис спрашивай конкретнее, не пересказывать же учебник.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Получение координат по таймеру. Как сделать таймер ?

Сообщение KamiSempai » 10 янв 2015, 14:02

R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

andr
Сообщения: 9
Зарегистрирован: 28 окт 2014, 02:40

Re: Получение координат по таймеру. Как сделать таймер ?

Сообщение andr » 10 янв 2015, 23:05

Сделал два приложения - один сервис и работа с ним, а другое по таймеру вызывает тост.
Теперь хочу, чтобы сервис по таймеру делал определенные действия, но приложение вылетает..

andr
Сообщения: 9
Зарегистрирован: 28 окт 2014, 02:40

Re: Получение координат по таймеру. Как сделать таймер ?

Сообщение andr » 11 янв 2015, 05:22

С этим разобрался.

Но появилась проблема. Не знаю даже почему так.
Суть в чем: я запускаю приложение, создается сервис, он работает, делает, что надо. Я нажимаю стрелочку назад, потом зажимаю домик, закрываю там мое приложение, запустившие сервис и все ок. Сервис работает в фоне. Если надо его остановить - запускаю приложение и нажимаю кнопку остановки.
Но!! Если я запустив приложение, выйду из него нажатием домика и потом закрою его через домик(подержу домик, появится список открытых приложений, пальцем в бок на приложении) - тогда возникает ошибка! "в приложении возникла ошибка"
Как так то ? Куда смотреть ? Может знает кто ?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Получение координат по таймеру. Как сделать таймер ?

Сообщение Foenix » 11 янв 2015, 12:27

смотреть ошибку в логе надо.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

andr
Сообщения: 9
Зарегистрирован: 28 окт 2014, 02:40

Re: Получение координат по таймеру. Как сделать таймер ?

Сообщение andr » 11 янв 2015, 15:37

Феникс, вот лог:
01-11 12:35:38.090: E/AndroidRuntime(685): FATAL EXCEPTION: main
01-11 12:35:38.090: E/AndroidRuntime(685): java.lang.RuntimeException: Unable to start service com.example.traxess.sos.v1.MyService@411e5d38 with null: java.lang.NullPointerException
01-11 12:35:38.090: E/AndroidRuntime(685): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2507)
01-11 12:35:38.090: E/AndroidRuntime(685): at android.app.ActivityThread.access$1900(ActivityThread.java:130)
01-11 12:35:38.090: E/AndroidRuntime(685): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
01-11 12:35:38.090: E/AndroidRuntime(685): at android.os.Handler.dispatchMessage(Handler.java:99)
01-11 12:35:38.090: E/AndroidRuntime(685): at android.os.Looper.loop(Looper.java:137)
01-11 12:35:38.090: E/AndroidRuntime(685): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-11 12:35:38.090: E/AndroidRuntime(685): at java.lang.reflect.Method.invokeNative(Native Method)
01-11 12:35:38.090: E/AndroidRuntime(685): at java.lang.reflect.Method.invoke(Method.java:511)
01-11 12:35:38.090: E/AndroidRuntime(685): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-11 12:35:38.090: E/AndroidRuntime(685): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-11 12:35:38.090: E/AndroidRuntime(685): at dalvik.system.NativeStart.main(Native Method)
01-11 12:35:38.090: E/AndroidRuntime(685): Caused by: java.lang.NullPointerException
01-11 12:35:38.090: E/AndroidRuntime(685): at com.example.traxess.sos.v1.MyService.onStartCommand(MyService.java:130)
01-11 12:35:38.090: E/AndroidRuntime(685): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2490)



Вашу подпись, про NPE прочел, сейчас буду искать..

andr
Сообщения: 9
Зарегистрирован: 28 окт 2014, 02:40

Re: Получение координат по таймеру. Как сделать таймер ?

Сообщение andr » 12 янв 2015, 13:36

Не могу разобраться, почему сервис нормально не перезапускается.
Сервис запускается в mainActivity

Код: Выделить всё

startService(new Intent(this, MyService.class).putExtra("sos", 0));
Вообще, задумка такая: приложение запускается, в онкриейт запускается сервис.
Сервис раз в какое-то время берет координаты и передает их урлом, гетом, на сервер.
И если даже убить приложение - сервис работает в фоне.
Но проблема в том, что если убить приложение - сервис убивается.
Я думаю, проблема в том, что возвращает onStartCommand.. но я уже разные перепробовал START_STICKY, START_NOT_STICKY
все равно умирает, или просто не создается.
Еще почиатл об IntentService классе.. возмонжно его надо использовать ?

Заранее, спасибо за ответ!

вот сам класс сервис:

Код: Выделить всё

package com.example.sos.v1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;


import android.app.Service;
import android.widget.Toast;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


import android.os.Handler;

public class MyService extends Service {
	
	int sos;
	
	String myLatitude;
	String myLongitude;
	
	RequestTask myTask;
	
	private LocationManager locationManager;
	
	// run on another Thread to avoid crash
    private Handler mHandler = new Handler();
    final Handler handler = new Handler();
    
    Timer timer = new Timer();
  	final String LOG_TAG = "myLogs";
  	
  	private LocationListener locationListener = new LocationListener() {

	    @Override
	    public void onLocationChanged(Location location) {

	    	myLatitude=Double.toString(location.getLatitude());
	    	myLongitude=Double.toString(location.getLongitude());


	    }

	    @Override
	    public void onProviderDisabled(String provider) {
	    	
	    	String Text = "Provider Disabled";
		    Toast.makeText( getApplicationContext(), Text,Toast.LENGTH_SHORT).show();
	    }

	    @Override
	    public void onProviderEnabled(String provider) {
	    	String Text = "Provider Enabled";
		      Toast.makeText( getApplicationContext(), Text,Toast.LENGTH_SHORT).show();
	    }

	    @Override
	    public void onStatusChanged(String provider, int status, Bundle extras) {
	    	
	   
	    }
	  };

  public void onCreate() {
    super.onCreate();
    Log.d(LOG_TAG, "onCreate");

  
    final Handler handler = new Handler();
    
    
  }
  
  
  
  public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(LOG_TAG, "onStartCommand");
    sos = intent.getIntExtra("sos", 1);
    someTask();
    
    
    
    
TimerTask doAsynchronousTask = new TimerTask() {  
    	
    	
        @Override
        public void run() {
      	
            handler.post(new Runnable() {
                public void run() {       
                    try {
                    	locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                      	locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
                      	
                      	//locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 

                    	RequestTask myRequestTask = new RequestTask();
                    	myRequestTask.execute("http:lat="+
                    	myLatitude+"&lon="+myLongitude+"&sos="+sos);
                    	//myRequestTask.execute("http:lat=2&lon=5&sos=0");
                    	
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(doAsynchronousTask, 0, 2500); 
    
    
    Toast.makeText(getApplicationContext(), "Service start", Toast.LENGTH_LONG).show();
    
    
    return START_STICKY;
    //return START_NOT_STICKY;
    //return super.onStartCommand(intent, flags, startId);
  }

  public void onDestroy() {
    super.onDestroy();
    Log.d(LOG_TAG, "onDestroy");
    timer.cancel();
    Toast.makeText(getApplicationContext(), "Service STOP", Toast.LENGTH_LONG).show();
    
  }

  public IBinder onBind(Intent intent) {
    Log.d(LOG_TAG, "onBind");
    return null;
  }
  
  void someTask() {
	  
	  
  }
  
  

  
  
  class RequestTask extends AsyncTask<String, String, String>{
  	String responseString = null;
  	String responseStatusString = null;
  	BufferedReader inStream = null;
      @Override
      protected String doInBackground(String... uri) {
          HttpClient httpclient = new DefaultHttpClient();
          HttpResponse response;
          
          try {
    
              response = httpclient.execute(new HttpGet(uri[0]));
              inStream = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
              responseString = inStream.readLine();
              
          } catch (IOException e) {
              //TODO Handle problems..
          }
          return responseString;
      }

      @Override
      protected void onPostExecute(String result) {
          super.onPostExecute(result);
          //Do anything with response..
          //tv2.setText("T: " +responseString);
      }
      
  }//class async

  
}

Ответить