android中的线程

今天写的功能是一个loading界面,Loading界面有一个进度条,进度条完成之后,重新跳转到另外一个activity,但是这样做的话,使用返回键时,会返回到Loading界面,因此,改为在Loading界面之后,重新设置布局。

进度条在一个线程中执行,代码如下:

 new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for(int i = 0; i < 100; i ++) {
                    YaMain.this.progressBar.setProgress(i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                LinearLayout layout = new LinearLayout(YaMain.this);
                layout.setBackgroundColor(getResources().getColor(R.color.bg));
                
                TextView tv = new TextView(YaMain.this);
                tv.setText(R.string.app_name);
                layout.addView(tv);
                setContentView(layout);
                
            }
            
        });

加上这段代码之后,重新运行程序,程序发生错误而意外终止。不得已,改用handler来处理。

代码如下:

@SuppressLint("HandlerLeak") 
    private Handler myHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(msg.arg1 <= 100) {
                YaMain.this.progressBar.setProgress(msg.arg1);
                this.postDelayed(YaMain.this.myRunnable, 10);
            }
        }
    };
    
    private Runnable myRunnable = new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Message msg = YaMain.this.myHandler.obtainMessage();
            msg.arg1 = (int) Math.ceil(YaMain.this.progressBar.getMax() / 100) + YaMain.this.progressBar.getProgress();
            YaMain.this.myHandler.sendMessage(msg);
            if(YaMain.this.progressBar.getProgress() >= YaMain.this.progressBar.getMax()) {
                YaMain.this.myHandler.removeCallbacks(this);
                LinearLayout layout = new LinearLayout(YaMain.this);
                layout.setBackgroundColor(getResources().getColor(R.color.bg));
                
                TextView tv = new TextView(YaMain.this);
                tv.setText(R.string.app_name);
                layout.addView(tv);
                setContentView(layout);
            }
        }
        
    };

在handleMessage里面,可以加入多个需要启动的线程,但是需要做好结束条件的判断,否则线程会一直运行。

这样的话,在需要的地方启动线程即可。

this.myHandler.post(this.myRunnable);

如果逻辑比较复杂的,可以把handler及runnable重新实现为自己的类,在调用。

这是我参考网上的资料写的,若是有不足之处或是更好的方法,欢迎交流指正。


你可能感兴趣的:(android中的线程)