0

こんにちは、MapView アプリの読み込みに時間がかかるため、読み込み中に水平スタイルの ProgressDialog を表示したいと考えました。onCreate/onStart メソッドでダイアログを表示しようとすると、最後にダイアログが 100% 完了して表示されましたが、これは、onCreate/onStart メソッドの後まで画面に何も描画されないためであることに気付きました。

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

前もって感謝します!=]

編集:

ソースコードは次のとおりです。

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

}
4

1 に答える 1

1

高価なコードを実行する必要がある場合は、バックグラウンド スレッドで実行して、UI がロックアップしないようにする必要があります。このプロセスに関連するいくつかの UI 要素を表示するために、Android はAsyncTaskまさにこの目的のためのクラスを提供します。

を表示するにはProgressDialog、実装onPreExecute()に実装しAsyncTask、ダイアログを作成して表示し、次に でそれをonPostExecute()閉じます。

于 2012-04-15T20:11:01.023 に答える