【问题标题】:Android: Thread with progressBar and setcurrentTabAndroid:带有progressBar 和setcurrentTab 的线程
【发布时间】:2012-01-02 12:17:25
【问题描述】:
   final ProgressDialog Pdialog = ProgressDialog.show(SpinnerClass.this, "", 
                        "Loading. Please wait...", true);
                Thread ProgressThread = new Thread() {
                    @Override
                    public void run() {
                        try {
                                     sleep(3000);   
                                     Pdialog.dismiss();

                        } catch(InterruptedException e) {
                            // do nothing
                        } finally {

                        }
                    }
                };
                ProgressThread.start();
                TabHost1 TabHost1Object2 = new TabHost1();
                TabHost1Object2.tabHost.setCurrentTab(2);

我对这个线程的问题是它在进度对话框开始之前设置了当前选项卡。我做错了什么? 我希望对话框运行并关闭,并在线程完成后设置选项卡。

【问题讨论】:

    标签: android multithreading android-tabhost progressdialog


    【解决方案1】:

    为此使用AsyncTask

    一些提示:

    public class BackgroundAsyncTask extends  AsyncTask<Void, Integer, Void> {  
        int myProgress;
        @Override
        protected void onPostExecute(Void result) {
        TabHost1 tab = new TabHost1();
        tab.tabHost.setCurrentTab(2);
        progressBar.dismiss();
    
        }
        @Override
        protected Void doInBackground(Void... params) {   
            while(myProgress<100){
                myProgress++;
                publishProgress(myProgress);
                SystemClock.sleep(100);
            }
            return null;
        }
    
        @Override
        protected void onProgressUpdate(Integer p) {   
            progressBar.setProgress(p);
        }
    
    }
    

    【讨论】:

    • 主标题具有误导性。对不起。我的意思是 ProgressDialog 不是 ProgressBar。是不是也一样?
    • 是的,ProgressDialog 也一样,你必须实现 onPreExecute() 才能显示 ProgressDialog
    【解决方案2】:

    问题是,您正在启动一个不会影响您的主 UI 的线程。所以最终会发生的是,您的线程将单独运行,现在将允许执行您的代码的下一行。所以在你的情况下,

                TabHost1 TabHost1Object2 = new TabHost1();
                TabHost1Object2.tabHost.setCurrentTab(2);
    

    无论你的线程是否同时执行,这些行都会被执行。所以你可以在这里做的是你可以去 AsyncTask 或者创建处理程序来处理你的这部分代码。您必须像这样更改代码。

    在您的 onCreate()

    中执行此操作
               Handler handler;
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 0) {
             Pdialog.dismiss();     
                 TabHost1 TabHost1Object2 = new TabHost1();
                TabHost1Object2.tabHost.setCurrentTab(2);
    
             }
           };
    

    现在在你的线程中,像这样调用处理程序,

      final ProgressDialog Pdialog = ProgressDialog.show(SpinnerClass.this, "", 
                        "Loading. Please wait...", true);
                Thread ProgressThread = new Thread() {
                    @Override
                    public void run() {
                        try {
                                     sleep(3000);   
    
    
                        } catch(InterruptedException e) {
                            // do nothing
                        } finally {
    
                                 handler.sendEmptyMessage(0);
                        }
                    }
                };
    this will allow your tabhost to wait until the thread gets executed and will come into view after thread finishes execution. 
    

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2013-01-26
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多