2012-04-15 13 views
0

Hallo meine MapView App braucht eine lange Zeit zu laden, also wollte ich einen horizontalen Stil ProgressDialog anzeigen, während es lädt. Wenn ich versuchte, den Dialog in den onCreate/onStart-Methoden anzuzeigen, wurde der Dialog am Ende mit 100% abgeschlossen angezeigt. Ich erkenne nun, dass erst nach den onCreate/onStart-Methoden nichts auf den Bildschirm gezeichnet wird.So zeigen Sie einen ProgressDialog an, nachdem die Hauptansicht gezeichnet wurde. Android

Also, was ich tun möchte, ist die grundlegende Karte anzeigen und führen Sie dann den anspruchsvollen Code nach der Karte wie gezeichnet und so kann ich auch einen ProgressDialog anzeigen. Ist das möglich und wie wäre es?

Vielen Dank im Voraus! =]

EDIT:

Hier ist der Quellcode:

public class GoogleMapsActivity extends MapActivity { 
    private List<Overlay> mapOverlays; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      MapView mapView = (MapView) findViewById(R.id.mapview); 
      mapView.setBuiltInZoomControls(true); 
      mapView.setSatellite(false); 
      mapView.setTraffic(false); 

      mapOverlays = mapView.getOverlays(); 

      new ProgressTask(this).execute(); 
    } 

    public void addToMap(ItemizedOverlay<OverlayItem> itemizedOverlay){ 
     mapOverlays.add(itemizedOverlay); 
    } 
} 

Und die AsyncTask Klasse

public class ProgressTask extends AsyncTask<String, Void, Boolean> { 

    private ProgressDialog dialog; 
    private GoogleMapsActivity activity; 

    public ProgressTask(GoogleMapsActivity activity) { 
     this.activity = activity; 
     dialog = new ProgressDialog(activity); 
    } 

    @Override 
    protected void onPreExecute() { 
     dialog.setTitle("Loading Pictures"); 
     dialog.setMessage("Loading..."); 
     dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 

    @Override 
    protected void onPostExecute(final Boolean sucess) { 
     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 
    } 

    @Override 
    protected Boolean doInBackground(String... args) { 
     try { 

      ArrayList<String> list = getImageLocations(); 

      String filePath; 
      String title; 

      LayerDrawable drawable; 
      ImageItemizedOverlay itemizedOverlay; 

      GeoPoint point; 
      OverlayItem overlayItem; 

      int count = 0; 

      if (list.size() > 0) { 
       dialog.setMax(list.size()); 

       for (String s : list) { 
        filePath = s; 
        point = getImageGeoPoint(s); 

        if (point != null) { 
         title = s.substring(filePath.lastIndexOf("/") + 1); 

         drawable = createLayerDrawable(filePath); 

         itemizedOverlay = new ImageItemizedOverlay(drawable, activity, filePath); 

         overlayItem = new OverlayItem(point, title, null); 

         itemizedOverlay.addOverlay(overlayItem); 
         activity.addToMap(itemizedOverlay); 
        } 
        dialog.incrementProgressBy(1); 
       } 

      } else { 
       if(dialog.isShowing()) 
        dialog.dismiss(); 

       CharSequence text = "No pictures with geolocations stored at DCIM/Camera."; 
       Toast toast = Toast.makeText(activity, text, Toast.LENGTH_LONG); 
       toast.show(); 
      } 
      CharSequence text = count + " pictures didn't have a geolocation."; 
      Toast toast = Toast.makeText(activity, text, Toast.LENGTH_LONG); 
      toast.show(); 
      return true; 
     } catch (Exception e) { 
      Log.e("tag", "error: " + e.toString(), e); 
      return false; 
     } 
    } 

    private LayerDrawable createLayerDrawable(String filePath) { 

     Bitmap bitmap = BitmapFactory.decodeFile(filePath); 
     Bitmap thumbnail = ThumbnailUtils.extractThumbnail(bitmap, 50, 50); 

     Drawable picture = new BitmapDrawable(thumbnail); 

     Drawable pin = activity.getResources() 
       .getDrawable(R.drawable.backgroundpin); 

     InsetDrawable inset = new InsetDrawable(picture, 11, 15, 11, 23); 
     Drawable[] list = { pin, inset }; 

     LayerDrawable layer = new LayerDrawable(list); 

     return layer; 
    } 

    private static GeoPoint getImageGeoPoint(String filename) { 
     GeoPoint gp = null; 
     float[] latlong = new float[2]; 

     try { 
      ExifInterface tag = new ExifInterface(filename); 

      if (tag.getLatLong(latlong)) { 
       gp = new GeoPoint((int) (latlong[0] * 1E6), 
         (int) (latlong[1] * 1E6)); 
      } else { 
       // TODO error! 
      } 

     } catch (FileNotFoundException fnf) { 
      // TODO error! 
      fnf.printStackTrace(); 
     } catch (IOException io) { 
      // TODO error! 
      io.printStackTrace(); 
     } 

     return gp; 
    } 

    private static ArrayList<String> getImageLocations() { 
     File directory = new File("mnt/sdcard/DCIM/Camera"); 

     FilenameFilter imageFilter = new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       String lowercaseName = name.toLowerCase(); 
       if (lowercaseName.endsWith(".jpg")) { 
        return true; 
       } else { 
        return false; 
       } 
      } 
     }; 

     File[] files = directory.listFiles(imageFilter); 
     ArrayList<String> paths = new ArrayList<String>(); 

     if (files != null && files.length > 0) 
      for (File f : files) { 
       paths.add(f.getAbsolutePath()); 
      } 

     return paths; 
    } 

} 
+0

Können Sie Ihre Quelle oder zumindest Ihre Implementierung von 'onCreate' posten? –

+0

Sicher Sache !! =] – geekman92

Antwort

1

Wenn Sie teuren Code ausführen müssen, soll es auf einem ausgeführt werden Hintergrund-Thread, um zu verhindern, dass Ihre Benutzeroberfläche gesperrt wird. Damit einige UI-Elemente für diesen Prozess angezeigt werden, bietet Android die Klasse AsyncTask für diesen Zweck an.

ein ProgressDialog, zeigen onPreExecute() in Ihrer AsyncTask Implementierung implementiert und schaffen und den Dialog zeigen, dann in onPostExecute(), sie entlassen.

+0

Okay, danke, ich werde mich darum kümmern! =] – geekman92

+0

Es hat wirklich gut funktioniert, vielen Dank dafür! =] – geekman92

+0

Sehr gut. Ihre 'else'-Anweisung in der' doInBackground'-Methode wird jedoch 'InvocationTargetException' auslösen, da Sie die Anzeigeeigenschaften eines UI-Elements (' Toast' und den 'ProgressDialog') für den Thread, auf dem sie nicht erstellt wurden, nicht ändern können. Obwohl ich mich über "ProgressDialog" irren kann ... Ich denke, dass Sie es möglicherweise von einem Nicht-UI-Thread ablehnen können. –

Verwandte Themen