Autore Topic: modificare la posizione dei marker  (Letto 656 volte)

Offline asnif

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3neo
  • Sistema operativo:
    linux mint win7
modificare la posizione dei marker
« il: 10 Ottobre 2014, 18:01:43 CEST »
0
l'app deve leggere dei dati dal web e aggiornare la posizione dei marker sulla mappa secondo questi dati.

per la lettura dei dati tutto ok.

ma ho problemi a modificare la posizione. in particolare sembra che non posso accedere al oggetto di tipo GoogleMap all'interno del metodo run. il compilatore non da problemi ma a run time mi dice che il thread non è stato completato correttamente.

è un problema normale, o è una stranezza del mio codice?

posto un riassunto del codice. :)

se il metodo aggiungiMarker lo chiamo da questa classe funziona!
Codice (Java): [Seleziona]
package com.example.localizzatore;

import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class Mappa {
        private static GoogleMap googleMap = null;

        private static Mappa istanza;

        public static Mappa getMappa() {
                return istanza;
        }

        public static void setMap(MapFragment frag) {
                // chiama il costruttore
                if (istanza == null) {
                        istanza = new Mappa(frag);
                }
        }

        private Mappa(MapFragment frag2) {

                googleMap = frag2.getMap();

                // inizializzo la mappa
                // Changing map type
                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                // Showing / hiding your current location
                googleMap.setMyLocationEnabled(true);

                // Enable / Disable zooming controls
                googleMap.getUiSettings().setZoomControlsEnabled(false);

                // Enable / Disable my location button
                googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                // Enable / Disable Compass icon
                googleMap.getUiSettings().setCompassEnabled(true);

                // Enable / Disable Rotate gesture
                googleMap.getUiSettings().setRotateGesturesEnabled(true);

                // Enable / Disable zooming functionality
                googleMap.getUiSettings().setZoomGesturesEnabled(true);

                double latitudinee = 17.385054;
                double longitudinee = 78.486671;

                CameraPosition cameraPosition = new CameraPosition.Builder()
                                .target(new LatLng(latitudinee, longitudinee)).zoom(15).build();

                googleMap.animateCamera(CameraUpdateFactory
                                .newCameraPosition(cameraPosition));

                aggiungiMarker();
               
        }
       
        public void aggiungiMarker() {
               
                try {
                        double latitudinee = 17.385054;
                        double longitudinee = 78.486671;

                        // Adding a marker
                        MarkerOptions marker = new MarkerOptions().position(
                                        new LatLng(latitudinee, longitudinee)).draggable(true).title("Hello Maps ");

                        // cambio il colore
                        marker.icon(BitmapDescriptorFactory
                                        .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

                        // lo aggiungo alla mappa
                        googleMap.addMarker(marker);
                } catch (Exception e) {
                                Log.w("MAPPA","aggiorna mappa",e);
                }

        }



}


ma io lo voglio chiamare da questa classe
Codice (Java): [Seleziona]
package com.example.localizzatore;

import java.util.TimerTask;

import android.util.Log;

class MyTimerTask extends TimerTask {
        int cont = 0;
        Client myClient=new Client();
Mappa myMappa=Mappa.getMappa();
       
        MainActivity mio;

        public void run() {
                //aggiorna i dati
                myClient.sendHttpRequest();
               
                //dovrei aggiornare la mappa

               
                        myMappa.aggiungiMarker();
               
               
        }
}

se preferite semplifico il codice mettendo tutto sul activity!!!

[/code]

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:modificare la posizione dei marker
« Risposta #1 il: 10 Ottobre 2014, 19:00:22 CEST »
+1
Il logcat sarebbe quantomeno d'aiuto per capire che intendi quando scrivi "il thread non è stato completato correttamente".
Senza il logcat si può solo fare supposizioni.
La mia supposizione, ma è solo ipotetica visto che non ho idea di come inizializzi e lanci MyTimerTask, è che ottieni un NullPointerException quando esegui aggiungiMarker(), perché istanza tornata da Mappa.getMappa() è null.
« Ultima modifica: 10 Ottobre 2014, 19:01:54 CEST da Sakazaki »

Offline asnif

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3neo
  • Sistema operativo:
    linux mint win7
Re:modificare la posizione dei marker
« Risposta #2 il: 10 Ottobre 2014, 19:36:40 CEST »
0
grazie per la risposta! anche io avevo pensato la stessa cosa che mi hai suggerito ma ho verificato che non è null.

ho scritto un altro codice che si focalizza sull'errore. :) così si può guardare tutto. velocemente

Codice (Java): [Seleziona]
package com.example.provamappa;

import java.util.Timer;
import java.util.TimerTask;


import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

        public GoogleMap googleMap = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                initilizeMap();
                timerAggiornaMappa();

        }

        private void initilizeMap() {
                if (googleMap == null) {
                        googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                                        R.id.map)).getMap();

                        // check if map is created successfully or not
                        if (googleMap == null) {
                                Toast.makeText(getApplicationContext(),
                                                "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                                                .show();
                        } else {
                                // inizializzo la mappa
                                // Changing map type
                                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                                // Showing / hiding your current location
                                googleMap.setMyLocationEnabled(true);

                                // Enable / Disable zooming controls
                                googleMap.getUiSettings().setZoomControlsEnabled(false);

                                // Enable / Disable my location button
                                googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                                // Enable / Disable Compass icon
                                googleMap.getUiSettings().setCompassEnabled(true);

                                // Enable / Disable Rotate gesture
                                googleMap.getUiSettings().setRotateGesturesEnabled(true);

                                // Enable / Disable zooming functionality
                                googleMap.getUiSettings().setZoomGesturesEnabled(true);

                                double latitudinee = 17.385054;
                                double longitudinee = 78.486671;

                                CameraPosition cameraPosition = new CameraPosition.Builder()
                                                .target(new LatLng(latitudinee, longitudinee)).zoom(15)
                                                .build();

                                googleMap.animateCamera(CameraUpdateFactory
                                                .newCameraPosition(cameraPosition));
                        }
                }
        }

        public void timerAggiornaMappa() {
                int startUp = 2000; // millisecondi di attesa per fare partire il timer
                int periodo = 1000; // millisecondi di attesa per la ripetizione del
                                                        // timer

                Timer timer = new Timer(); // timer

                // il metodo run viene eseguito ad ogni scadenza del timer
                timer.scheduleAtFixedRate(new TimerTask() {
                        double i = 0;

                        public void run() {
                                aggiungiMarker();
                        }
                }, startUp, periodo);
        }
       
       
        public void aggiungiMarker() {
                try {
                        double latitudinee = 17.385054;
                        double longitudinee = 78.486671;

                        // Adding a marker
                        MarkerOptions marker = new MarkerOptions().position(
                                        new LatLng(latitudinee, longitudinee)).draggable(true).title("Hello Maps ");

                        // setto il colore
                        marker.icon(BitmapDescriptorFactory
                                        .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

                        // lo aggiungo alla mappa
                        googleMap.addMarker(marker);
                       
                } catch (Exception e) {
                                Log.w("MAPPA","aggiorna mappa",e);
                }
        }

}

i logCat sono questi :)

10-10 19:34:55.897: E/MoreInfoHPW_ViewGroup(17304): Parent view is not a TextView
10-10 19:34:56.737: W/ActivityThread(17304): ClassLoader.loadClass: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());
10-10 19:34:58.837: W/MAPPA(17304): aggiorna mappa
10-10 19:34:58.837: W/MAPPA(17304): java.lang.IllegalStateException: Not on the main thread
10-10 19:34:58.837: W/MAPPA(17304):    at com.google.j.a.cl.b(Unknown Source)
10-10 19:34:58.837: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.br.b(Unknown Source)
10-10 19:34:58.837: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.dw.a(Unknown Source)
10-10 19:34:58.837: W/MAPPA(17304):    at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
10-10 19:34:58.837: W/MAPPA(17304):    at android.os.Binder.transact(Binder.java:361)
10-10 19:34:58.837: W/MAPPA(17304):    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
10-10 19:34:58.837: W/MAPPA(17304):    at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
10-10 19:34:58.837: W/MAPPA(17304):    at com.example.provamappa.MainActivity.aggiungiMarker(MainActivity.java:115)
10-10 19:34:58.837: W/MAPPA(17304):    at com.example.provamappa.MainActivity$1.run(MainActivity.java:95)
10-10 19:34:58.837: W/MAPPA(17304):    at java.util.Timer$TimerImpl.run(Timer.java:284)
10-10 19:34:59.837: W/MAPPA(17304): aggiorna mappa
10-10 19:34:59.837: W/MAPPA(17304): java.lang.IllegalStateException: Not on the main thread
10-10 19:34:59.837: W/MAPPA(17304):    at com.google.j.a.cl.b(Unknown Source)
10-10 19:34:59.837: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.br.b(Unknown Source)
10-10 19:34:59.837: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.dw.a(Unknown Source)
10-10 19:34:59.837: W/MAPPA(17304):    at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
10-10 19:34:59.837: W/MAPPA(17304):    at android.os.Binder.transact(Binder.java:361)
10-10 19:34:59.837: W/MAPPA(17304):    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
10-10 19:34:59.837: W/MAPPA(17304):    at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
10-10 19:34:59.837: W/MAPPA(17304):    at com.example.provamappa.MainActivity.aggiungiMarker(MainActivity.java:115)
10-10 19:34:59.837: W/MAPPA(17304):    at com.example.provamappa.MainActivity$1.run(MainActivity.java:95)
10-10 19:34:59.837: W/MAPPA(17304):    at java.util.Timer$TimerImpl.run(Timer.java:284)
10-10 19:35:00.837: W/MAPPA(17304): aggiorna mappa
10-10 19:35:00.837: W/MAPPA(17304): java.lang.IllegalStateException: Not on the main thread
10-10 19:35:00.837: W/MAPPA(17304):    at com.google.j.a.cl.b(Unknown Source)
10-10 19:35:00.837: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.br.b(Unknown Source)
10-10 19:35:00.837: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.dw.a(Unknown Source)
10-10 19:35:00.837: W/MAPPA(17304):    at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
10-10 19:35:00.837: W/MAPPA(17304):    at android.os.Binder.transact(Binder.java:361)
10-10 19:35:00.837: W/MAPPA(17304):    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
10-10 19:35:00.837: W/MAPPA(17304):    at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
10-10 19:35:00.837: W/MAPPA(17304):    at com.example.provamappa.MainActivity.aggiungiMarker(MainActivity.java:115)
10-10 19:35:00.837: W/MAPPA(17304):    at com.example.provamappa.MainActivity$1.run(MainActivity.java:95)
10-10 19:35:00.837: W/MAPPA(17304):    at java.util.Timer$TimerImpl.run(Timer.java:284)
10-10 19:35:01.847: W/MAPPA(17304): aggiorna mappa
10-10 19:35:01.847: W/MAPPA(17304): java.lang.IllegalStateException: Not on the main thread
10-10 19:35:01.847: W/MAPPA(17304):    at com.google.j.a.cl.b(Unknown Source)
10-10 19:35:01.847: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.br.b(Unknown Source)
10-10 19:35:01.847: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.dw.a(Unknown Source)
10-10 19:35:01.847: W/MAPPA(17304):    at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
10-10 19:35:01.847: W/MAPPA(17304):    at android.os.Binder.transact(Binder.java:361)
10-10 19:35:01.847: W/MAPPA(17304):    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
10-10 19:35:01.847: W/MAPPA(17304):    at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
10-10 19:35:01.847: W/MAPPA(17304):    at com.example.provamappa.MainActivity.aggiungiMarker(MainActivity.java:115)
10-10 19:35:01.847: W/MAPPA(17304):    at com.example.provamappa.MainActivity$1.run(MainActivity.java:95)
10-10 19:35:01.847: W/MAPPA(17304):    at java.util.Timer$TimerImpl.run(Timer.java:284)
10-10 19:35:02.847: W/MAPPA(17304): aggiorna mappa
10-10 19:35:02.847: W/MAPPA(17304): java.lang.IllegalStateException: Not on the main thread
10-10 19:35:02.847: W/MAPPA(17304):    at com.google.j.a.cl.b(Unknown Source)
10-10 19:35:02.847: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.br.b(Unknown Source)
10-10 19:35:02.847: W/MAPPA(17304):    at com.google.maps.api.android.lib6.c.dw.a(Unknown Source)
10-10 19:35:02.847: W/MAPPA(17304):    at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
10-10 19:35:02.847: W/MAPPA(17304):    at android.os.Binder.transact(Binder.java:361)




se eseguo    aggiungiMarker();  dentro il metodo onCreate e commento timerAggiornaMappa() tutto funziona come dovrebbe.

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:modificare la posizione dei marker
« Risposta #3 il: 10 Ottobre 2014, 20:13:17 CEST »
+1
Buona a sapersi, pare proprio che l'aggiornamento della mappa non possa essere fatto da un Thread diverso da quello che è "owner" del componente.

Direi che hai due opzioni:
- fai in modo che il TimerTask, invece di chiamare metodi che tentano di modificare la mappa, lanci un'intent custom all'activity che richiamerà il metodo per l'aggiornamento.
- usi un AlarmManager per schedulare un PendingIntent che informi l'activity che deve aggiornare la posizione nella mappa, è un po' più rognoso ma tenterei di usare questo sistema che mi sembra più adatto alla casistica.
(anche perché il secondo l'ho adottato in passato e sono certo che si può fare, il primo mi è venuto così di getto e ci sta che abbia scritto una sciocchezza :P )
« Ultima modifica: 10 Ottobre 2014, 20:16:28 CEST da Sakazaki »

Offline asnif

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3neo
  • Sistema operativo:
    linux mint win7
Re:modificare la posizione dei marker
« Risposta #4 il: 10 Ottobre 2014, 21:37:20 CEST »
0
grazie per la risposta! :)

per l'alarmManager poteva essere una soluzione ma merdaccia! non può andare perchè la classe che deve ricevere deve
extends BroadcastReceiver

e poichè deve ricevere l'activity non si può perchè già estende l'activity. che cacca!
maledette limitazioni!

oppure hai qualche suggerimento?!?

oppure dovrò usare il primo consiglio.

grazie!

« Ultima modifica: 10 Ottobre 2014, 23:36:08 CEST da asnif »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:modificare la posizione dei marker
« Risposta #5 il: 10 Ottobre 2014, 22:20:08 CEST »
+1
vuoi dire che dovrei mettere il metodo che aggiorna dentro onResume() ?

No, usa un BroadcastReceiver:

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

  public GoogleMap googleMap = null;
  //...

  private BroadcastReceiver myReceiver =
          new BroadcastReceiver() {
           @Override
           public void onReceive(Context context, Intent intent) {
             // Update
             aggiungiMarker();
           }
         };

  @Override
  public void onResume() {
    super.onResume();

    LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, new IntentFilter("update-map"));

    //...
  }

  @Override
  protected void onPause() {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver);
    super.onPause();
  }

  public void timerAggiornaMappa() {
    int startUp = 2000; // millisecondi di attesa per fare partire il timer
    int periodo = 1000; // millisecondi di attesa per la ripetizione del
                                 // timer

    Timer timer = new Timer(); // timer

    // il metodo run viene eseguito ad ogni scadenza del timer
    timer.scheduleAtFixedRate(new MyTimerTask(this), startUp, periodo);
  }
     
//...

public class MyTimerTask extends TimerTask {
  private Activity myActivity;
 
  public MyTimerTask(Activity activity) {
    myActivity = activity;
  }

  public void run() {
    Intent intent = new Intent("update-map");
    LocalBroadcastManager.getInstance(myActivity).sendBroadcast(intent);
  }
}

NB: non l'ho provato, ma ad occhio dovrebbe andare a meno di correzioni.

Offline asnif

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3neo
  • Sistema operativo:
    linux mint win7
Re:modificare la posizione dei marker
« Risposta #6 il: 10 Ottobre 2014, 23:37:27 CEST »
0
grazie gli do un occhiata

Post unito: 11 Ottobre 2014, 11:56:10 CEST
siiiiiiiiiiiiiiiii  :D :D :D :D :D

FUNZIONA!

grazie oggi è il mio compleanno e mi hai fatto un regalo fantastico! :)

ti voglio bene :) :P

a presto
« Ultima modifica: 11 Ottobre 2014, 11:56:10 CEST da asnif, Reason: Merged DoublePost »

Offline gferrari77

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:modificare la posizione dei marker
« Risposta #7 il: 14 Ottobre 2014, 23:16:21 CEST »
0
l'app deve leggere dei dati dal web e aggiornare la posizione dei marker sulla mappa secondo questi dati.

per la lettura dei dati tutto ok.

ma ho problemi a modificare la posizione. in particolare sembra che non posso accedere al oggetto di tipo GoogleMap all'interno del metodo run. il compilatore non da problemi ma a run time mi dice che il thread non è stato completato correttamente.

è un problema normale, o è una stranezza del mio codice?

posto un riassunto del codice. :)

se il metodo aggiungiMarker lo chiamo da questa classe funziona!
Codice (Java): [Seleziona]
package com.example.localizzatore;

import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class Mappa {
        private static GoogleMap googleMap = null;

        private static Mappa istanza;

        public static Mappa getMappa() {
                return istanza;
        }

        public static void setMap(MapFragment frag) {
                // chiama il costruttore
                if (istanza == null) {
                        istanza = new Mappa(frag);
                }
        }

        private Mappa(MapFragment frag2) {

                googleMap = frag2.getMap();

                // inizializzo la mappa
                // Changing map type
                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                // Showing / hiding your current location
                googleMap.setMyLocationEnabled(true);

                // Enable / Disable zooming controls
                googleMap.getUiSettings().setZoomControlsEnabled(false);

                // Enable / Disable my location button
                googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                // Enable / Disable Compass icon
                googleMap.getUiSettings().setCompassEnabled(true);

                // Enable / Disable Rotate gesture
                googleMap.getUiSettings().setRotateGesturesEnabled(true);

                // Enable / Disable zooming functionality
                googleMap.getUiSettings().setZoomGesturesEnabled(true);

                double latitudinee = 17.385054;
                double longitudinee = 78.486671;

                CameraPosition cameraPosition = new CameraPosition.Builder()
                                .target(new LatLng(latitudinee, longitudinee)).zoom(15).build();

                googleMap.animateCamera(CameraUpdateFactory
                                .newCameraPosition(cameraPosition));

                aggiungiMarker();
               
        }
       
        public void aggiungiMarker() {
               
                try {
                        double latitudinee = 17.385054;
                        double longitudinee = 78.486671;

                        // Adding a marker
                        MarkerOptions marker = new MarkerOptions().position(
                                        new LatLng(latitudinee, longitudinee)).draggable(true).title("Hello Maps ");

                        // cambio il colore
                        marker.icon(BitmapDescriptorFactory
                                        .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

                        // lo aggiungo alla mappa
                        googleMap.addMarker(marker);
                } catch (Exception e) {
                                Log.w("MAPPA","aggiorna mappa",e);
                }

        }



}


ma io lo voglio chiamare da questa classe
Codice (Java): [Seleziona]
package com.example.localizzatore;

import java.util.TimerTask;

import android.util.Log;

class MyTimerTask extends TimerTask {
        int cont = 0;
        Client myClient=new Client();
Mappa myMappa=Mappa.getMappa();
       
        MainActivity mio;

        public void run() {
                //aggiorna i dati
                myClient.sendHttpRequest();
               
                //dovrei aggiornare la mappa

               
                        myMappa.aggiungiMarker();
               
               
        }
}

se preferite semplifico il codice mettendo tutto sul activity!!!

[/code]

Offline gferrari77

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:modificare la posizione dei marker
« Risposta #8 il: 14 Ottobre 2014, 23:16:52 CEST »
0
l'app deve leggere dei dati dal web e aggiornare la posizione dei marker sulla mappa secondo questi dati.

per la lettura dei dati tutto ok.

ma ho problemi a modificare la posizione. in particolare sembra che non posso accedere al oggetto di tipo GoogleMap all'interno del metodo run. il compilatore non da problemi ma a run time mi dice che il thread non è stato completato correttamente.

è un problema normale, o è una stranezza del mio codice?

posto un riassunto del codice. :)

se il metodo aggiungiMarker lo chiamo da questa classe funziona!
Codice (Java): [Seleziona]
package com.example.localizzatore;

import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class Mappa {
        private static GoogleMap googleMap = null;

        private static Mappa istanza;

        public static Mappa getMappa() {
                return istanza;
        }

        public static void setMap(MapFragment frag) {
                // chiama il costruttore
                if (istanza == null) {
                        istanza = new Mappa(frag);
                }
        }

        private Mappa(MapFragment frag2) {

                googleMap = frag2.getMap();

                // inizializzo la mappa
                // Changing map type
                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                // Showing / hiding your current location
                googleMap.setMyLocationEnabled(true);

                // Enable / Disable zooming controls
                googleMap.getUiSettings().setZoomControlsEnabled(false);

                // Enable / Disable my location button
                googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                // Enable / Disable Compass icon
                googleMap.getUiSettings().setCompassEnabled(true);

                // Enable / Disable Rotate gesture
                googleMap.getUiSettings().setRotateGesturesEnabled(true);

                // Enable / Disable zooming functionality
                googleMap.getUiSettings().setZoomGesturesEnabled(true);

                double latitudinee = 17.385054;
                double longitudinee = 78.486671;

                CameraPosition cameraPosition = new CameraPosition.Builder()
                                .target(new LatLng(latitudinee, longitudinee)).zoom(15).build();

                googleMap.animateCamera(CameraUpdateFactory
                                .newCameraPosition(cameraPosition));

                aggiungiMarker();
               
        }
       
        public void aggiungiMarker() {
               
                try {
                        double latitudinee = 17.385054;
                        double longitudinee = 78.486671;

                        // Adding a marker
                        MarkerOptions marker = new MarkerOptions().position(
                                        new LatLng(latitudinee, longitudinee)).draggable(true).title("Hello Maps ");

                        // cambio il colore
                        marker.icon(BitmapDescriptorFactory
                                        .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

                        // lo aggiungo alla mappa
                        googleMap.addMarker(marker);
                } catch (Exception e) {
                                Log.w("MAPPA","aggiorna mappa",e);
                }

        }



}


ma io lo voglio chiamare da questa classe
Codice (Java): [Seleziona]
package com.example.localizzatore;

import java.util.TimerTask;

import android.util.Log;

class MyTimerTask extends TimerTask {
        int cont = 0;
        Client myClient=new Client();
Mappa myMappa=Mappa.getMappa();
       
        MainActivity mio;

        public void run() {
                //aggiorna i dati
                myClient.sendHttpRequest();
               
                //dovrei aggiornare la mappa

               
                        myMappa.aggiungiMarker();
               
               
        }
}

se preferite semplifico il codice mettendo tutto sul activity!!!

[/code]