Как реализовать заставку в приложении с TabActivity и MapActivity в качестве вкладки по умолчанию? - PullRequest
1 голос
/ 19 февраля 2012

Я разрабатываю приложение, в котором есть несколько вкладок, и в одной из них (по умолчанию) указано MapActivity. Мой MapActivity получил свой собственный ProgressDialog (загружает некоторые вещи onCreate).

Когда я пытаюсь загрузить другую ProgressDialog в моей основной деятельности (TabActivity), черный экран появляется, пока карта не загрузится. Затем диалоговое окно MapActivity показывает и скрывает (после загрузки материала), а затем диалоговое окно TabActivity показывает ...

Обратите внимание, что я начинаю диалог TabActivity в TabActivity.onCreate() перед вызовом намерения с MapActivity.

Кто-нибудь может мне помочь?

Код моего TabActivity:

public class MyTabActivity extends TabActivity {

    private ProgressDialog progressDialog = null;
    private Handler progressDialogHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (null != progressDialog)
                progressDialog.dismiss();
            super.handleMessage(msg);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(false);
        progressDialog.show();

        setContentView(R.layout.main);

        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                prepareTabs();
                return null;
            }

            protected void onPostExecute(Void result) {
                progressDialogHandler.sendEmptyMessage(0);
            };
        }.execute();
    }

    private void prepareTabs() {
        TabHost tabHost = getTabHost();
        TabHost.TabSpec spec;
        Intent intent;

        intent = new Intent().setClass(this, MyMapActivity.class);
        spec = tabHost.newTabSpec(MyMapActivity.TAG).setIndicator(MyMapActivity.TAG).setContent(intent);
        tabHost.addTab(spec);
    }
}

Ошибка, которую я получаю (строка с tabHost.addTab(spec);): E/AndroidRuntime(8762), FATAL EXCEPTION: AsyncTask #1

А вот и MyMapActivity:

public class MyMapAcitivity extends MapActivity {
    private MapView mapView;
    private ProgressDialog progressDialog = null;
    private Handler progressDialogHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (null != progressDialog)
                progressDialog.dismiss();
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "onCreate()");
        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_map_activity);

        loadMap();
        setupLocationBasedServices();
    }

    private void loadMap() {
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);

        loadEvents();
    }

    private void loadEvents() {
        progressDialog = new ProgressDialog(MyMapActivity.this);
        progressDialog.setMessage("Loading events...");
        progressDialog.show();
        new AsyncTask<Void, Void, ArrayList<Event>>() {
            @Override
            protected ArrayList<Event> doInBackground(Void... params) {
                new EventLoader().loadEvents();
                progressDialogHandler.sendEmptyMessage(0);
                return eventLoader.getEvents();
            }
        }.execute();
    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
}

1 Ответ

0 голосов
/ 19 февраля 2012

Если бы вы могли опубликовать некоторую маркировку кода, где вы видите это поведение, но из того, что вы описали, похоже, что основной поток блокируется. Попробуйте переместить вещи, которые не важны для пользовательского интерфейса, в фоновый режим ( AsyncTask ).

UPDATE:

Я думаю, вы должны избавиться от диалогового окна прогресса на вкладке Activity. Я даже вернусь сюда и предложу удалить AsyncTask (теперь, когда я могу видеть, что происходит). Кроме того, в onCreate () в TabActivity удалите диалоговые окна, это, вероятно, приводит к блокировке потока.

Я думаю, что единственный диалог прогресса должен быть MyMapActivity.loadEvents(). Я думаю, что поведение, которое вы описываете, немного сложное. Если бы это был я, я бы проследил это вручную, установив с помощью отладчика, что вызывается, когда и в каком потоке. Если бы у меня была моя машинка для разработки, я бы попробовал ее сам, но, к сожалению, нет. Я посмотрю, смогу ли я повторить вашу проблему чуть позже.

...