如何使用TabActivity和MapActivity作为默认选项卡在app中实现启动画面?

时间:2012-02-18 22:26:12

标签: android android-mapview splash-screen android-tabhost

我正在开发一个应用程序,其中有一些选项卡,其中一个(默认为一个)是MapActivity。我的MapActivity拥有自己的ProgressDialog(它会加载一些内容onCreate)。

当我尝试在我的主要活动(ProgressDialog)中加载另一个TabActivity时,黑色屏幕会显示,直到地图加载为止。然后MapActivity的对话框显示并隐藏(加载内容后),然后TabActivity的对话框显示...

请注意,在使用TabActivity调用intent之前,我在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 :(得分:0)

如果您可以在看到这些行为的位置发布一些代码标记,但是根据您所描述的内容,听起来主线程被阻止了。尝试将对UI不重要的内容移动到后台(AsyncTask)。

更新:

我认为你应该在你的标签Activity中删除进度对话框。我甚至会在这里回溯建议删除AsyncTask(现在我可以看到发生了什么)。此外,在TabActivity中的onCreate()中,删除对话框,这可能导致线程阻塞。

我认为唯一的进度对话框应该是MyMapActivity.loadEvents()。我认为你描述的行为有点复杂。如果这是我,我会手动跟踪,通过调试器设置调用什么,何时以及在哪个线程上。如果我有我的开发机器,我会尝试自己的,但不幸的是我没有。我会看看能否稍后复制你的问题。