2013-02-16 15 views
6

Yaptığım son şey şudur: Uygulamamda google map'üm som düğmeleri ve ekstra içerikler var. ama aynı zamanda benim harita içinde her zaman bir işaretleyici güncellenmiş yerini göstermek zorunda (Ben harici cihazdan veri android telefonun gps sensörü değil alırsınız). Bu yüzden ilk önce ipliği kullanmayı düşündüm ancak kodumda gördüğünüz gibi AsyncTask olarak değişiyor ve addMarker yöntemini kullanmaya çalıştım ancak haritayı her çalıştırdığımda sadece çalışmayı durduracağım. Şimdi harita üzerinde bir işaretçiyi göstermek istiyorum ama şimdi başarılı! GoogleMap haritasına, kullanıcı arayüzü aracılığıyla ve AsyncTask içinden ulaşılamıyor. bununla karşılaştı mı? ben bu çözmek için ne yapması gerektiğini ... plz İşte İşaretleyicileri her zaman Google map sürüm 2'de AsyncTask veya Handler tarafından nasıl gösterilecek?

package com.example.mapsversion2; 

    //All imports 

    public class MainActivity extends Activity { 
    static final LatLng exmpoint = new LatLng(59.331438,18.064957); 

    public static GoogleMap map; 

    Button button; 
    Button waypointButton; 
    Button destinationButton; 
    Marker wayPoint; 
    TextView positiontext; 
    int countclick= 3; 
    public static DataModel autoboxdata= new DataModel(); 
    public static Bitmap arrowBitmap; 
    Marker currentPlace; 
    MapFragment mapF; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mapF = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)); 
    map= mapF.getMap(); 
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 

    // positiontext = (TextView) findViewById(R.id.position); 

    // Move the camera instantly to hamburg with a zoom of 15. 
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(exmpoint,15)); 

    // Zoom in, animating the camera. 
    map.animateCamera(CameraUpdateFactory.zoomTo(6), 2000, null); 

    addListenerOnButton(); 
    map.setOnMarkerDragListener(this); 

    new PositionUpdate1().execute(); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
    } 

    public void addListenerOnButton() { 

     destinationButton= (Button) findViewById(R.id.destinationB); 

     destinationButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       //do something 
      } 
     });  
    } 

    } 

    public class PositionUpdate1 extends AsyncTask<Void, Void, Void>{ 


    @Override 
    protected Void doInBackground(Void...arg0) { 
     // TODO Auto-generated method stub 


     map.addMarker(new MarkerOptions() 
      .position(hereIam)); 

     System.out.println("hej"); 
     return null; 
    } 
    } 
    } 

LogCat olduğunu yardımcı olur: Sen arka plan iş parçacığı haritaya bir işaret katmaya çalışıyoruz

02-17 18:57:17.805: E/AndroidRuntime(9905): FATAL EXCEPTION: main 
02-17 18:57:17.805: E/AndroidRuntime(9905): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mapsv2/com.example.mapsv2.MainActivity}: java.lang.NullPointerException 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.ActivityThread.access$600(ActivityThread.java:140) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.os.Looper.loop(Looper.java:137) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at dalvik.system.NativeStart.main(Native Method) 
02-17 18:57:17.805: E/AndroidRuntime(9905): Caused by: java.lang.NullPointerException 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at com.example.mapsv2.MainActivity.onCreate(MainActivity.java:140) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.Activity.performCreate(Activity.java:5206) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
02-17 18:57:17.805: E/AndroidRuntime(9905):  ... 11 more 
02-17 18:57:17.935: E/android.os.Debug(2287): [email protected] > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error 

cevap

17

ancak Android'deki kullanıcı arayüzünü UI iş parçacığı dışındaki bir iş parçacığından güncelleyemiyor. Yani, arka plan operasyon sonrası UI iş parçacığı içinde denir onPostExecute yöntemi için map.addMarker çağrıyı taşımak tamamlandıktan:

:
public class PositionUpdate1 extends AsyncTask<Void, Void, Location> { 

    @Override 
    protected Location doInBackground(Void...arg0) { 
     // get your location... 
     return hereIam; 
    } 

    @Override 
    protected void onPostExecute(Location loc) { 
     map.addMarker(new MarkerOptions().position(loc)); 
    } 
} 

sürekli işaretleyici güncellemek istiyorsanız

, en kolay yolu bir Handler kullanmaktır cours,

private class AddMarker implements Runnable { 

    private GoogleMap map; 
    private MarkerOptions options; 

    public AddMarker(GoogleMap map, MarkerOptions options) { 
     this.map = map; 
     this.options = options; 
    } 

    @Override 
    public void run() 
    { 
     map.addMarker(options); 
    } 
} 
Runnable addMarker = new AddMarker(map, markerOptions); 
activity.runOnUiThread(addMarker); 

Ve: En zaman uyumsuz görev aşağıdakileri yapabilirsiniz birden fazla işaretleyici yüklenip yüklenmediği

public class MainActivity extends Activity { 

    final int MARKER_UPDATE_INTERVAL = 2000; /* milliseconds */ 
    Handler handler = new Handler(); 

    GoogleMap map; 
    Marker marker; 
    Location location; 

    Runnable updateMarker = new Runnable() { 
     @Override 
     public void run() { 
      marker.remove(); 
      marker = map.addMarker(new MarkerOptions().position(location)); 

      handler.postDelayed(this, MARKER_UPDATE_INTERVAL); 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     map = ...; // get map 
     location = ...; // get location 
     marker = map.addMarker(new MarkerOptions().position(location)); 

     handler.postDelayed(updateMarker, MARKER_UPDATE_INTERVAL); 
    } 

    @Override 
    protected void onDestroy() { 
     handler.removeCallbacks(updateMarker); 

     super.onDestroy(); 
    } 
} 
+0

Bunu yaptım. hala uygulama çalışmayı durdurur. Aynı Logcat hatalarıyla –

+0

Tamam, "MainActivity" de 140 satırında bir "NullPointerException" var. Haritanızın boş olmadığından emin misiniz? ("Google Play Hizmetleri cihazda yüklü değilse," mapF.getMap() 'çağrısı," null "i döndürecektir, bu nedenle işaretleyiciyi ana iş parçacığı içine eklediğimde – whyleee

+0

her şeyin işe yaradığını unutmayın. ve ben işaretini görüyorum .. ve evet Google oyun hizmetlerini kurdum Servis –

1

e, async görevini etkinlik nesnesiyle oluşturmalısınız.

+0

Her 1 saniyede 6 işaretçi nasıl güncellenir. –

3

Böyle bir şey yapabilirsiniz. İhtiyacınız olan verileri doInBackground'a yükleyin ve işaretçileri onProgressUpdate'de çizin. OnProgressUpdate'i çağırmak için doInBackground'dan bir publishProgress() yapın. Bu şekilde UI'yi ASyncTask içinden güncelleyebilirsiniz. Benim için çalışıyor.

public class CDrawHotspotsAsync extends AsyncTask<Void, CHotspot, Boolean> 
{ 
private final Context mCntxt; 
private final GoogleMap mGMap; 

// --------------------------------------------------------- 

public CDrawHotspotsAsync(Context cntxt, GoogleMap gmap) 
{ 
    this.mCntxt = cntxt; 
    this.mGMap = gmap; 
} 

// --------------------------------------------------------- 

private void drawMarker(GoogleMap gmap, CHotspot hotspot) 
{ 
    // Set marker options 
    MarkerOptions mo = new MarkerOptions(); 
    mo.position(hotspot.getPosition()); 
    mo.title(hotspot.getName()); 
    String descr = hotspot.getAddress() + ", " + hotspot.getPostal() + ", " + hotspot.getCity(); 
    mo.snippet(descr); 
    mo.icon(BitmapDescriptorFactory.fromResource(R.drawable.hotspot_marker)); 

    // Add marker to map 
    gmap.addMarker(mo); 
} 

// --------------------------------------------------------- 

@Override 
protected Boolean doInBackground(Void... params) 
{ 
    // Get hotspots from database 
    CHotspotList hotspots = new CHotspotList(this.mCntxt); 
    ArrayList<CHotspot> arrHotspots = hotspots.getHotspotList(); 

    for (CHotspot hotspot : arrHotspots) 
    { 
     // Publish progress 
     publishProgress(hotspot); 
    } 

    // Always return true 
    return true; 
} 

// --------------------------------------------------------- 

@Override 
protected void onProgressUpdate(CHotspot... hotspot) 
{ 
    // Draw the marker 
    drawMarker(this.mGMap, hotspot[0]); 
} 
} 
İlgili konular