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 线程通信学习

  • 2015-05-22 09:20
  • 803KB
  • 下载

android线程管理五(ActivityThread与ApplicationThread)

前言       android中App第一次启动时,会创建一个进程,在这个进程中可以启动各个组件(如Activity、BroadcastReceiver、Service),这些组件都是在同一个进程...

Android跨线程通信状态框架Simple2Develop【更新至0.2.0】

一、基本信息 Simple2Develop 是一款基于Android平台的跨线程通信框架,可以让你以一种简单的方式进行复杂的通信,支持同进程中多Activity之间即时交互,子线程与主线程之间的交互等...

Android定时器和线程实现

  • 2014-12-02 19:46
  • 1.38MB
  • 下载

Android如何高效的加载图片(2)---在ui线程中处理Bitmaps

前面我们总结了Androd中如何去加载尺寸比较大的图片。现在我们需要考虑的问题是当我们从磁盘或者网络中加载图片时,由于磁盘的读取速度或者网速的原因导致话费很长的时间去加载。如果吧这些耗时的代码放在ui...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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