Android中的线程

原创 2015年11月21日 10:53:30

在UI线程中不允许存在阻断的当有需要耗时操作的时候需要另起一个新的线程。例如简单的一个例子:

在页面出现一个圆圈进度条,他是执行一个耗时操作的任务,在这里对其进行睡眠达到这个效果。则需要一个新的子线程来执行这个操作:

 PopupWindow pop;
    ProgressDialog pd;

   //进度框的显示
    public void pdshow(){
        pd = new ProgressDialog(this);
        pd.setTitle("消息框");
        pd.setMessage("请稍后。。。");
        pd.setCancelable(true);
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.show();
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //super.handleMessage(msg);
            //关闭进度条
             pd.dismiss();
        }
    };

    public void btonclick(View v){

        //调用显示进度条的方法
        pdshow();
       //新建立一个子线程让其在三秒之后把刚才打开的进度条关闭
         new Thread(){
            @Override
            public void run() {
                super.run();
                for(int i=0; i<3; i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                handler.sendEmptyMessage(0);
            }
        }.start();

        /*LayoutInflater inflater = LayoutInflater.from(this);
        View myview = inflater.inflate(R.layout.layout_my_dialog, null);
        //AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //builder.setView(myview);
        pop = new PopupWindow(myview, 600, 500);

        myview.findViewById(R.id.bt_02).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // Toast.makeText(MainActivity2.this, "点击了确定", Toast.LENGTH_SHORT).show();
                pop.dismiss();
            }
        });
        //pop.showAsDropDown(v);
        pop.showAtLocation(v, Gravity.CENTER, 0, 0);*/
        //dialog = builder.create();
        //dialog.show();
        //builder.show();

    }
如果把圆圈的进度条转化为长的进度条时:

 PopupWindow pop;
    ProgressDialog pd;

    public void pdshow(){
        pd = new ProgressDialog(this);
        pd.setTitle("消息框");
        pd.setMessage("请稍后。。。");
        pd.setCancelable(true);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMax(10);  //最终需要完成的量
        pd.show();
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //super.handleMessage(msg); 需要根据不同的message判断应该怎么处理
            if(msg.what == 0){
                pd.dismiss();
            } else {
                pd.setProgress(msg.arg1);
            }

        }
    };

    public void btonclick(View v){

        pdshow();
        new Thread(){
            @Override
            public void run() {
                super.run();
                for(int i=1; i<11; i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //不在进行发送空消息 而是发送包含message的消息以进行判断
                    Message msg = Message.obtain();
                    msg.arg1 = i;
                    msg.what = 1;
                    handler.sendMessage(msg);
                }
                handler.sendEmptyMessage(0);
            }
        }.start();

        /*LayoutInflater inflater = LayoutInflater.from(this);
        View myview = inflater.inflate(R.layout.layout_my_dialog, null);
        //AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //builder.setView(myview);
        pop = new PopupWindow(myview, 600, 500);

        myview.findViewById(R.id.bt_02).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // Toast.makeText(MainActivity2.this, "点击了确定", Toast.LENGTH_SHORT).show();
                pop.dismiss();
            }
        });
        //pop.showAsDropDown(v);
        pop.showAtLocation(v, Gravity.CENTER, 0, 0);*/
        //dialog = builder.create();
        //dialog.show();
        //builder.show();

    }
在这顺便说一下 当退出一个程序的时候,需求是需要按两次退出时才退出:

实现代码:

private long mExitTime;
    @Override
    public void onBackPressed() {
        //super.onBackPressed();
        /*new AlertDialog.Builder(this)
                .setIcon(R.drawable.ic_launcher)
                .setTitle("确认对话框")
                .setMessage("您真的要退出程序么?")
                .setNegativeButton("取消", null)
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).show();*/

       //在第一次点击退出的时候mExitTime默认是为0的所以一开始两个的差值必然是大于2分钟的 然后取当前按下的时间给mExtiTime进行赋值再进行差值判断
        if((System.currentTimeMillis()-mExitTime) > 2000){
            Toast.makeText(this, "请再按一次退出", Toast.LENGTH_SHORT).show();
            mExitTime = System.currentTimeMillis();
        } else {
            finish();
        }


    }















Android_Handler的线程队列Demo

  • 2015年12月07日 00:03
  • 2.53MB
  • 下载

Android中Service与Activity的有关于进程与线程的问题

这两天来都在研究Android中Service与Activity的有关于进程与线程的问题,也是很苦恼,一直以来都以为用StartService(Intent)启动Service能一直在后台运行,与启动...
  • Canvar
  • Canvar
  • 2016年03月26日 16:59
  • 252

android线程handler、message、looperDEMO

  • 2014年03月02日 15:52
  • 1.41MB
  • 下载

Xamarin.Android 非UI线程更新UI

  • 2015年02月09日 11:24
  • 14KB
  • 下载

[初试Android]Service+跨线程操作GUI的一个小例子

[初试Android]Service+跨线程操作GUI的一个小例子 1、实验内容                本例子练习使用Service以及控件的跨线程操作:主Activity界面用来启动、...
  • Unee_Yu
  • Unee_Yu
  • 2012年12月27日 00:25
  • 1480

android 线程入门教程

  • 2014年08月09日 19:05
  • 720KB
  • 下载

android中在子线程中更新UI的几种方法

我们都知道android中,不允许在子线程中更新UI,凡是更新UI的操作必须放到主线程中,否则就会报如下异常: android.view.ViewRoot$CalledFromWrongThread...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中的线程
举报原因:
原因补充:

(最多只允许输入30个字)