2012-04-15 20 views
0

こんにちは、私のMapViewのアプリケーションは、ロードする間、水平スタイルのProgressDialogを表示したいと思ったので、ロードに時間がかかります。 onCreate/onStartメソッドでダイアログを表示しようとしたときに、ダイアログが100%完了して最後に表示されましたが、これはonCreate/onStartメソッドの後まで画面に何も描画されないためです。メインビューを描画した後にProgressDialogを表示する方法。 Android

は、だから私がやりたいものを基本的なマップを表示して描画され、マップ後に厳しいコードを実行し、私はまた、ProgressDialogを表示することができます。これは可能ですか?

ありがとうございます! =]

EDIT:あなたは高価なコードを実行する必要がある場合、それはA上で実行されなければならない

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); 
    } 
} 

そしてAsyncTaskクラス

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

ソース、または少なくともonCreateの実装を投稿できますか? –

+0

もちろん! =] – geekman92

答えて

1

:ここ

は、ソースコードでありますあなたのUIがロックされないようにします。いくつかのUI要素をこのプロセスに関連させて表示させるために、Androidはこの目的のためにAsyncTaskクラスを提供しています。 ProgressDialogを表示するには

、あなたのAsyncTask実装でonPreExecute()を実装してダイアログを作成し、表示し、その後、onPostExecute()で、それを却下。

+0

大丈夫感謝します! =] – geekman92

+0

これは本当にうまくやってくれました! =] – geekman92

+0

非常に良い。しかし、 'doInBackground'メソッドの' else'ステートメントは、UI要素( 'Toast'と' ProgressDialog')の表示プロパティを、作成されていないスレッドで変更することができないため、 'InvocationTargetException'をスローします。しかし、私は 'ProgressDialog'について間違っているかもしれません...私はあなたが非UIスレッドからそれを却下することが許されるかもしれないと思います。 –

関連する問題