ProgressDialog 通过点击按钮,弹出一个对话框
2016-09-11 21:14
615 查看
一、Handler的定义:
主要接受子线程发送的数据, 并用此数据配合主线程更新UI。
解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据, 或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 “强制关闭”。 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。 这个时候,Handler就出现了。,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。
1.在主布局文件定义progress组件
2.在MainActivity代码
在android开发中,在线程中不能访问UI组件的。
线程可以分为:UI线程(主线程)和工作线程(子线程)
这个限制,是为了保正UI组件的线程安全
那么在工作线程中需要访问UI组件时,怎么办?
Android给我们提供的访问方式是:使用Handler处理器
我们可以在UI线程中定义一个Handler的子类对象,
并实现handlerMessage(Message msg)方法来处理消息,在工作线程中通过Handler
的子类对象发送一个消息到Handler中,再由Handler处理后更新UI组件。
在所有UI组件中,Pro
9ecb
gress(进度组件)是一个特殊处理的组件,
所以该组件可以在工作线程中访问
主要接受子线程发送的数据, 并用此数据配合主线程更新UI。
解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据, 或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 “强制关闭”。 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。 这个时候,Handler就出现了。,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。
1.在主布局文件定义progress组件
<ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/progressBar" android:max="100" android:progress="0" android:indeterminate="false"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示对话框" android:id="@+id/show" android:onClick="showProgressDialog"/>
2.在MainActivity代码
private MyHandler handler; private static final int DOWNLOAD_SUCCESS =0X1 ; private ExecutorService es = Executors.newFixedThreadPool(10); private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); //内部类利用外部类的属性,要在外部类添加final es.execute(new Runnable() { @Override public void run() { while(progressBar.getProgress()<progressBar.getMax()){ progressBar.incrementProgressBy(10); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); handler =new MyHandler(); } private class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case DOWNLOAD_SUCCESS: Toast.makeText(MainActivity.this,msg.obj.toString(), Toast.LENGTH_LONG).show(); break; } } } //按钮的点击事件 public void showProgressDialog(View view){ //在对话框使用进度条对话框 final ProgressDialog pd =new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setProgress(0); pd.setMax(100); pd.setTitle("下载"); pd.setMessage("正在下载中"); pd.setIndeterminate(false); //进度是否为不确定的 pd.setCancelable(true); //设置是否可以取消 pd.setCanceledOnTouchOutside(false); //点击对话框外是否取消 //在对话框设置按钮 // pd.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // // } // }); // // pd.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // // } // }); // pd.setButton(DialogInterface.BUTTON_NEGATIVE, "中立", new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // // } // }); pd.show(); es.execute(new Runnable() { @Override public void run() { while(pd.getProgress()<pd.getMax()){ pd.incrementProgressBy(10); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } pd.dismiss();//退出对话框 Message msg = handler.obtainMessage(); msg.what=DOWNLOAD_SUCCESS; //定义一个标记,what,obj属性 // Bundle b =new Bundle(); // b.putString("color","下载成功"); // msg.setData(b); msg.obj="下载完成"; //给UI线程传送数据 handler.sendMessage(msg); //发送一个消息对象 } }); } }
在android开发中,在线程中不能访问UI组件的。
线程可以分为:UI线程(主线程)和工作线程(子线程)
这个限制,是为了保正UI组件的线程安全
那么在工作线程中需要访问UI组件时,怎么办?
Android给我们提供的访问方式是:使用Handler处理器
我们可以在UI线程中定义一个Handler的子类对象,
并实现handlerMessage(Message msg)方法来处理消息,在工作线程中通过Handler
的子类对象发送一个消息到Handler中,再由Handler处理后更新UI组件。
在所有UI组件中,Pro
9ecb
gress(进度组件)是一个特殊处理的组件,
所以该组件可以在工作线程中访问
相关文章推荐
- DataGrid点击删除按钮弹出确认对话框一个好办法
- 事件1:点击一个按钮,弹出一个对话框
- DataGrid点击删除按钮弹出确认对话框一个好办法
- MFC 点击一个对话框按钮弹出另一个对话框
- QT的一个奇怪问题,设置了Qt::Tool后,点击弹出对话框的确定取消按钮,程序直接退出
- 点击一个按钮,弹出一个对话框,对弹出的对话框进行配置
- 点击新增按钮,弹出对话框,并且对话框加载另外一个页面的内容的具体实现
- QT学习3:在VS2013下通过点击按钮弹出一个新的窗口
- DataGrid点击删除按钮弹出确认对话框一个好办法
- QT的一个奇怪问题,设置了Qt::Tool后,点击弹出对话框的确定取消按钮,程序直接退出。
- 事件3:点击一个按钮,弹出一个对话框
- DataGrid点击删除按钮弹出确认对话框一个好办法
- asp.net 点击一个按钮弹出对话框选择文件然后选择文件完成之后就自动上传文件 input(file)
- C#中点击一个按钮后,弹出“数据连接属性”对话框
- DataGrid点击删除按钮弹出确认对话框一个好办法
- VC中怎样点击按钮弹出一个对话框
- DataGrid点击删除按钮弹出确认对话框一个好办法
- 我点击保存按钮后,先弹出一个保存成功的对话框
- C#+Emgucv通过点击按钮弹出选择文件对话框
- 点击一个按钮,弹出一个对话框,对弹出的对话框进行配置