两个activity 前一个按扭点击事件执行查询,数据量比较大,所以跳转等待时间比较长,固想用进度条显示程序运行中...该如何实现?

解决方案 »

  1.   

    点击按钮后show一个ProgressDialog,然后开个线程去执行查询,查询完成后通过Handler关闭ProgressDialog,启动下个activity.
      

  2.   

    应该能看懂吧 
    package com.zyq.main;import java.util.ArrayList;import android.app.Activity;
    import android.app.Dialog;
    import android.app.ListActivity;
    import android.app.ProgressDialog;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.Toast;
    public class ListProgressDemo extends ListActivity {
        private ArrayAdapter<String> adapter; 
        private ArrayList<String> data; 
     
        private static final int PROGRESS_DIALOG = 1; 
        private static final int STATE_FINISH = 1; 
        private static final int STATE_ERROR = -1; 
     
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            ((Button) findViewById(R.id.load_Handler)).setOnClickListener(new View.OnClickListener(){ 
     
                @Override 
                public void onClick(View view) { 
                    data = null; 
                    data = new ArrayList<String>(); 
     
                    adapter = null; 
     
                    showDialog(PROGRESS_DIALOG); 
                    new ProgressThread(handler, data).start();
                } 
            }); 
        }
     
        @Override 
        protected Dialog onCreateDialog(int id) { 
            switch(id) { 
            case PROGRESS_DIALOG: 
                     return ProgressDialog.show(this, "",  
                       "Loading. Please wait...", true); 
     
            default: return null; 
            } 
        } 
     
        private class ProgressThread extends Thread { 
     
            private Handler handler; 
            private ArrayList<String> data; 
     
            public ProgressThread(Handler handler, ArrayList<String> data) { 
                this.handler = handler; 
                this.data = data; 
            } 
     
            @Override 
            public void run() { 
                for (int i=0; i<8; i++) { 
                    data.add("ListItem"); //后台数据处理
                    try { 
                        Thread.sleep(100); 
                    }catch(InterruptedException e) { 
                         
                        Message msg = handler.obtainMessage(); 
                        Bundle b = new Bundle(); 
                        b.putInt("state", STATE_ERROR); 
                        msg.setData(b); 
                        handler.sendMessage(msg);  
                         
                    } 
                } 
                Message msg = handler.obtainMessage(); 
                Bundle b = new Bundle(); 
                b.putInt("state", STATE_FINISH); 
                msg.setData(b); 
                handler.sendMessage(msg);
            } 
             
        } 
     
        // 此处甚至可以不需要设置Looper,因为Handler默认就使用当前线程的Looper
        private final Handler handler = new Handler(Looper.getMainLooper()) {
     
            public void handleMessage(Message msg) { // 处理Message,更新ListView
                int state = msg.getData().getInt("state"); 
                switch(state){ 
                    case STATE_FINISH: 
                        dismissDialog(PROGRESS_DIALOG); 
                        Toast.makeText(getApplicationContext(), 
                                "加载完成!", 
                                Toast.LENGTH_LONG) 
                             .show(); 
     
                        adapter = new ArrayAdapter<String>(getApplicationContext(), 
                                android.R.layout.simple_list_item_1, 
                                data ); 
                                 
                        setListAdapter(adapter); 
     
                        break; 
     
                    case STATE_ERROR: 
                       dismissDialog(PROGRESS_DIALOG); 
                       Toast.makeText(getApplicationContext(), 
                               "处理过程发生错误!", 
                               Toast.LENGTH_LONG) 
                            .show(); 
     
                       adapter = new ArrayAdapter<String>(getApplicationContext(), 
                               android.R.layout.simple_list_item_1, 
                               data ); 
                                
                          setListAdapter(adapter); 
     
                          break; 
     
                   default: 
     
                } 
            } 
        }; 

      

  3.   

    好象没有activity 跳转吧。
      

  4.   

    查询在后一个activity内。前一个activity只负责传送参数.
      

  5.   

    楼主,关键代码3楼都写了。activity 跳转加上就是了。
      

  6.   

    贴长代码就会占用两层?BUG?
      

  7.   

    做个进度条不是本问题所在吧?可能我学得不好,我觉得这问题很难。
    因为跳转到另一个activity这个过程中,想再启动另外一个activity,那排队也排到后面了,所以,只能在跳转之前先弹出进程框,那么第一个activity可以访问进程框,第二个activity想访问就难了,因为还没启动起来啊。
    我不知道楼主所谓的慢,是数据查询慢呢,还是启动第二个activity慢,如果是前者慢,那倒是可以用个进程框来显示进程。有人做出来了吗?看看代码。
      

  8.   

    package CityLife.View;import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.graphics.Bitmap.Config;
    import android.graphics.Paint.Style;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    public class StartView extends Activity
    {
    //
    Paint paint = null;
    Bitmap mSCBitmap = null;
    Canvas mCanvas = null;
    //
    int a,b;
    int startDrawBgX, startDrawBgY;
    int startProgressX,startProgressY;
    int startRectX ,startRectY ;
    int rectW , rectH;
    Bitmap bmpStartBg;
    Bitmap bmpProgressBar;
    Bitmap bmpStartBgL;
    Bitmap bmpProgressBarL;
    Boolean runA = true; 
    //
    private MyView myView;   
    private Handler mHandler; 
        /** Called when the activity is first created. */
    @Override
        public void onCreate(Bundle savedInstanceState) 
        { 
         //设置全屏
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            this.getWindow().setFlags(WindowManager.LayoutParams.TYPE_STATUS_BAR,
                            WindowManager.LayoutParams.TYPE_STATUS_BAR);
            //
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //
            bmpStartBg = BitmapFactory.decodeResource(getResources(), R.drawable.startbg);
            bmpProgressBar = BitmapFactory.decodeResource(getResources(), R.drawable.progressbg); 
            //
            int w = bmpStartBg.getWidth()*2;
            int h = bmpStartBg.getWidth();
            int width = bmpStartBg.getWidth();
            int height = bmpStartBg.getHeight();
            int newWidth = w;
            int newHeight = h;
            float scaleWidth = ((float) newWidth) / width;
            float scaleHeight = ((float) newHeight) / height;
            a = (int) scaleWidth;
            b = (int) scaleHeight;
            //
            Matrix matrix = new Matrix();
            matrix.postScale(a, b);
            //
            bmpStartBgL = Bitmap.createBitmap(bmpStartBg, 0, 0, bmpStartBg.getWidth(),bmpStartBg.getHeight(), matrix, true);
            bmpProgressBarL = Bitmap.createBitmap(bmpProgressBar, 0, 0, bmpProgressBar.getWidth(),bmpProgressBar.getHeight(), matrix, true);
            //
        startDrawBgY = (this.getWindowManager().getDefaultDisplay().getHeight() - bmpStartBgL.getHeight()) / 2 - 40;
        startDrawBgX = (this.getWindowManager().getDefaultDisplay().getWidth() - bmpStartBgL.getWidth()) / 2;
        //     
        startProgressY = (this.getWindowManager().getDefaultDisplay().getHeight() - bmpProgressBarL.getHeight()) / 2 - 15;
        startProgressX = (this.getWindowManager().getDefaultDisplay().getWidth()  - bmpProgressBarL.getWidth()) / 2;
        //
        startRectX = startProgressX;
        startRectY = startProgressY;
        rectW = startProgressX+bmpProgressBarL.getWidth();
        rectH = startProgressY+bmpProgressBarL.getHeight();
            //
            myView = new MyView(this); 
            setContentView(myView);
            //
            mSCBitmap = Bitmap.createBitmap(320, 480, Config.ARGB_8888);
            mCanvas = new Canvas();
            mCanvas.setBitmap(mSCBitmap);
            //
            mHandler = new Handler();   
            mHandler.post(update);   
    }
    private Runnable update = new Runnable()
    {   
    public void run()
    {   
    myView.update();
            mHandler.postDelayed(update, 100);   
    }   
    };
    public class MyView extends View
    {
    public MyView(Context context)
    {   
    super(context);      
        }
    public void update()
    {   
    postInvalidate();   
    }
    protected void onDraw(Canvas canvas) 
    {
    // super.onDraw(canvas);   
    if(startRectX < startProgressX + bmpProgressBarL.getWidth())
    {
    startRectX = startRectX + 2;
    //首先定义一个paint 
    paint = new Paint();
    // 设置样式-填充
    paint.setStyle(Style.FILL);
    paint.setColor(UsedColor.startBgColor);
    // 绘制一个矩形 
    mCanvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
    //输出背景图片
    paint.setColor(UsedColor.progressBgColor); 
    mCanvas.drawBitmap(bmpStartBgL, startDrawBgX, startDrawBgY, paint);
    mCanvas.drawBitmap(bmpProgressBarL, startProgressX, startProgressY, paint);
    mCanvas.drawRect(new Rect(startRectX, startRectY, rectW, rectH), paint);
    canvas.drawBitmap(mSCBitmap, 0 ,0, paint);
    }
    else
    {
    if(runA)
             {
    finish();
             //生成一个Intent对象
             Intent intent = new Intent();
             intent.putExtra("textIntent", "");
             intent.setClass(StartView.this, MainView.class);
             StartView.this.startActivity(intent);
             runA = false;
             }
         }  
        }

    }这是我做的一个项目的, 就是启动界面 开头的一个登陆的activity 然后进入主界面。
      

  9.   

    所有代码都在这里吗?你这进程条好像只是给用户一个视觉上的感受啊,走进程条的时候,并没有做什么,更没有像楼主说的,去启动另外一个activity,你是在进程条走完的时候,才启动另一个activity的。你这进程条更像是延迟一段时间,而不是代表某项工作的进度。
      

  10.   

    不知道还能不能留言呢。。小弟不才,正好最近在做类似功能,在此提出一种设想:
    从ActivityA跳转到ActivityB
    1,你的下一个Activity不是加载的东西多吗?先不要运行B,你先在A中,点了跳转按钮之后就先开始加载,顺便开始画进度条
    2,等到加载完了,直接把结果们传给B(这个应该稍微快一点)