比方用户在进入一个页面,这个页面是listview的形式。显示的内容是重网上获取的数据,在获取完数据之前显示dialog提示正在下载,怎么搞?

解决方案 »

  1.   

    推荐一种做法:
    这个activity初始化的时候,做两件事情
    1.显示一个dialog,提示正在下载
    2.开启一个线程,从网络上获取数据
    等到数据获取完后,可用handler传递消息,dismiss() dialog、show listview
      

  2.   

    我现在没有开启一个线程,先做个测试
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    listView = new ListView(this);
    Mydialog.show();
    getData();


    // 利用系统的layout显示一项
     listView.setAdapter(new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, data));
     setContentView(listView);

     Mydialog.dismiss();
    }但是没有显示diaog 中间显示的是黑屏一段时间,说明正在下载。。我把dismiss去掉后,发现dialog是在获取完数据才显示的。这个怎么回事?谢谢。
      

  3.   

    黑屏?应该是GUI主线程阻塞了吧
    android的UI组件是非线程安全,对这种单线程模式,切记两件事:
    1.不要阻塞GUI主线程
    2.不要跨线程操作GUI线程的组件
    所以onCreate()方法中的程序不能有耗时过长的操作,以免阻塞GUI。如果有这种操作,建议新开线程完成这些操作,然后通过Handler在线程之间通信。
    所以dialog并不是在获取完数据才显示的,而是你的getData()操作阻塞你的GUI主线程
    强烈建议把getData()放入一个线程之中
      

  4.   


    在Activity中new出来List,然后加上数据,再用AlertDialog.Builder .setView进去,
      

  5.   

    用AsyncTask不是很简单就可以解决么?里面提供了几个很好用的重写方法,onPreExecute(),线程之前需要做的动作,这里你只需要new 一个ProgressDialog进行正在下载的弹出框显示,然后再doInBackground()方法里面做耗时操作。onProgressUpdate里面写耗时操作出现异常时的处理代码,onPostExecute()里面写耗时操作正常执行完以后的代码,这里你就将ProgressDialog给他dismiss掉然后发个Handler消息过去,UI界面接收到以后加载listView数据就OK了。感觉没啥难的
      

  6.   

    强烈建议不要在UI线程执行耗时操作,同时adapter的getView里面不要随便new对象,前者会造成ANR,后者影响性能。
      

  7.   

    1.showProgress
    2.new THread (弄listview的数据 , sendMessage)
    3.handlemessage(适配器刷一下 ,closeProgress) 
      

  8.   


    提示一下,thread里面不能new Handler哟