progressDialog和子线程模拟显示拷贝进度

package com.example.wang.myapplication;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class ZuoyeActivity4 extends AppCompatActivity {

    Button bt_1;
    Button bt_2;

    TextView tv_1;

    Handler h=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what==1)
            {
                tv_1.setText("拷贝完成");
            }
            else if(msg.what==2)
            {
                tv_1.setText("");
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zuoye4);

        bt_1=(Button)findViewById(R.id.bt_1);
        bt_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final ProgressDialog progressDialog=new ProgressDialog(ZuoyeActivity4.this);

                progressDialog.setTitle("拷贝进度");
                progressDialog.setMessage("拷贝中...");
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.show();

                new Thread(){
                    @Override
                    public void run() {

                        for (int i=0;i<=100;i++)
                        {
                            progressDialog.setProgress(i);

                            try {

                                Thread.sleep(100);
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                        }
                        progressDialog.dismiss();

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(ZuoyeActivity4.this, "拷贝完成", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }.start();
            }
        });

        tv_1=(TextView)findViewById(R.id.tv_1);
        bt_2=(Button)findViewById(R.id.bt_2);

        bt_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //常规方法跨线程访问组件
//                runOnUiThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        tv_1.setText("");
//                    }
//                });

                h.sendEmptyMessage(2);
                final ProgressDialog  progressdialog=new ProgressDialog(ZuoyeActivity4.this);

                progressdialog.setTitle("拷贝进度");

                progressdialog.setMessage("请稍后....");

                progressdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

                progressdialog.show();

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int i=0;i<100;i++)
                        {
                            progressdialog.setProgress(i);

                            try{
                                Thread.sleep(100);}
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                        }

                        progressdialog.dismiss();

                        h.sendEmptyMessage(1);
                    }
                }).start();

            }
        });

    }
}

java

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.wang.myapplication.ZuoyeActivity4"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始拷贝文件--普通方式"
        android:id="@+id/bt_1"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始拷贝文件--消息机制"
        android:id="@+id/bt_2"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#ccc"
        android:gravity="center"
        android:textSize="16sp"
        android:id="@+id/tv_1"/>

</LinearLayout>

xml

1.普通方式显示结果

2-消息机制结果

时间: 2024-10-14 11:18:10

progressDialog和子线程模拟显示拷贝进度的相关文章

ios线程练习更新进度条

类似于,我们加载网页时候的进度条,我们来看看它们是怎么工作的. #import "ViewController.h" @interface ViewController () { UIProgressView *_view; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //设置进度条 _view = [[UIProgressView alloc]init]; _view

Android子线程进度条不显示的问题

不显示进度条的代码逻辑: 首先,新建了一个类,此类有一个内部类,内部类继承Therad 类中有一个普通方法,普通方法执行的时候调用此方法中的内部类. 这时候,展示进度条. 进度条展示在普通方法中,那么实际展示的时间是在内部类执行完成后才展示,这样当然是不行的·· 进度条在子线程中展示则报错,百度的方法试过都不行.怎么办呢. 解决方案: 在类中建立一个普通的方法, 方法里直接new出子线程然后start 子线程中通过handler消息机制将耗时操作的数据结果返回给handler handler接收

Android——子线程操作主线程

子线程不能直接操作主线程 UI线程 //水平进度条 public void jdt1_onclick(View view) { final ProgressDialog pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("正在加载请稍后"); pd.show(); //创建thread实例 实现Runable接口 启动多线程 new Thr

第一章、主线程与子线程

第一章.主线程与子线程 但我们打开FBReader程序的一刻,代码会立即创建一个子线程.之后,主线程会负责在屏幕上显示一个进度条,而子线程则在后台开始读取epub文件. PS:进度条的样子如下图所示,不过由于加载速度很快,这进度条都是一闪而过的.这张图片是在单步调试的环境下截取的. 在这一章,我们将详细介绍,程序如何创建子线程,以及如何控制进度条的显示与消失. 本章涉及的核心类是UIUtil类. FBReader默认首先进入的FBReader类,这是在AndroidManifes.xml设定的.

Java线程池主线程等待子线程执行完成

今天讨论一个入门级的话题, 不然没东西更新对不起空间和域名~~ 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线程的流程,  往往需要让主线程指定后, 等待子线程的完成. 这里有几种方式. 站在 主线程的角度, 我们可以分为主动式和被动式. 主动式指主线主动去检测某个标志位, 判断子线程是否已经完成. 被动式指主线程被动的等待子线程的结束, 很明

Android -- ViewRoot,关于子线程刷新UI

Android在4.0之后执行线程更新UI操作会报异常:CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.那么你肯定能看到很多文章说android里子线程不能刷新UI.这句话不能说错,只是有些不太严谨.其实线程能否刷新UI的关键在于ViewRoot是否属于该线程. 首先,CalledFromWrongThreadException这个异

Java主线程如何等待子线程执行结束(转)

工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线程的流程,  往往需要让主线程指定后, 等待子线程的完成. 这里有几种方式. 站在 主线程的角度, 我们可以分为主动式和被动式. 主动式指主线主动去检测某个标志位, 判断子线程是否已经完成. 被动式指主线程被动的等待子线程的结束, 很明显, 比较符合人们的胃口. 就是你事情做完了, 你告诉我, 我汇

Android 子线程测试

private volatile boolean mStopped = false; private int i; TextView tv1; TextView tv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); tv1 = (TextView) findVie

Delphi7从子线程中发送消息到主线程触发事件执行

[转载]Delphi7从子线程中发送消息到主线程触发事件执行 在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上(可视),同时进行日志处理等.我用的是下面的方法: [1]用到的API函数: RegisterWindowsMessage ---------------------- 函数功能:该函数定义一个新的窗口消息,该消息确保在系统中是唯一的.返