android 自定义progressdialogg 显示

android中ProgressDialog执行完然后执行Toast程序异常终止为什么?
android中ProgressDialog执行完然后执行Toast程序异常终止
new Thread(){
public void run() {
if(DBManager.TestConnectDB(ipAddress, port, userName, passWord)){
Log.i(&syso&, &1&);
handler.sendEmptyMessage(0);
Log.i(&syso&, &2&);
//Toast.makeText(MainActivity.this, &连接成功&, Toast.LENGTH_SHORT).show();
Log.i(&syso&, &3&);
handler.sendEmptyMessage(0);
Log.i(&syso&, &4&);
Toast.makeText(MainActivity.this, &连接失败&, Toast.LENGTH_SHORT).show();
Log.i(&syso&, &5&);
}}.start();
执行完handler.sendEmptyMessage(0); &然后想用toast显示一下 & &结果程序异常停止了,为什么?
handler里面就一个progressDialog.dismiss();方法!
不要直接线程里面操作UI。。建议你的Toast在handler里面执行Android 自定义ProgressDialog进度条对话框用法详解
作者:java--hhf
字体:[ ] 类型:转载 时间:
ProgressDialog为进度对话框。android手机自带的对话框显得比较单一,我们可以通过ProgressDialog来自己定义对话框中将要显示出什么东西
ProgressDialog的基本用法
ProgressDialog为进度对话框。android手机自带的对话框显得比较单一,我们可以通过ProgressDialog来自己定义对话框中将要显示出什么东西。
首先看看progressDialog里面的方法
setProgressStyle:设置进度条风格,风格为圆形,旋转的。
setTitlt:设置标题
setMessage:设置提示信息;
setIcon:设置标题图标;
setIndeterminate:设置ProgressDialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。
setCancelable:设置ProgressDialog 是否可以按返回键取消;
CancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
show:显示ProgressDialog。
cancel:删除progressdialog
dismiss: 删除progressdialog 作用和cancel相同
setProgress(intCounter);更新进度条,当然一般都需要Handler的结合来更新进度条
&!--EndFragment--&
然后我们看看效果
实现代码如下
&span style=""&package cn.
import android.app.A
import android.app.ProgressD
import android.content.DialogI
import android.content.I
import android.os.B
import android.os.H
import android.os.M
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.T
public class SecondActivity extends Activity implements Runnable{
* Called when the activity is first created.
* Activity入口
private Button b_dialog,b_dialog1,//两个按钮
private ProgressDialog pd,pd1;//进度条对话框
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);//关联对应的界面
b_dialog = (Button)this.findViewById(R.id.button_dialog);
b_dialog1 = (Button)this.findViewById(R.id.Button_dialog1);
//处理事件发生时要做的事
b_dialog.setOnClickListener(listener);
b_dialog1.setOnClickListener(listener);
&span style=""& }
//定义监听器对象
private OnClickListener listener = new OnClickListener() {
// 鼠标按下后
public void onClick(View v) {
// 得到当前被触发的事件的ID —— 类型是int
int id = v.getId();
if(id == R.id.button_dialog){
//按下确定键就会消失的进程对话框
// pd = new ProgressDialog(SecondActivity.this);// 创建ProgressDialog对象
// pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);// 设置进度条风格,风格为圆形,旋转的
// pd.setTitle("提示");// 设置ProgressDialog 标题
// pd.setMessage("这是一个圆形进度条对话框");// 设置ProgressDialog提示信息
// pd.setIcon(R.drawable.icon);// 设置ProgressDialog标题图标
// // 设置ProgressDialog 的进度条是否不明确 false 就是不设置为不明确
// pd.setIndeterminate(false);
// pd.setCancelable(true); // 设置ProgressDialog 是否可以按退回键取消
// pd.setButton("确定", new Bt1DialogListener()); // 设置ProgressDialog 的一个Button
// pd.show(); // 让ProgressDialog显示
//过1秒钟就会自己消失的进程对话框
//弹出另外一种对话框
pd = ProgressDialog.show(SecondActivity.this, "自动关闭对话框", "Working,,,,,,1秒", true, false);
Thread thread = new Thread(SecondActivity.this);//开启一个线程来延时
thread.start();//启动线程
}else if(id == R.id.Button_dialog1){
pd1 = new ProgressDialog(SecondActivity.this);// 创建ProgressDialog对象
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置进度条风格,风格为圆形,旋转的
pd1.setTitle("提示");// 设置ProgressDialog 标题
pd1.setMessage("这是一个条状进度条对话框");// 设置ProgressDialog提示信息
pd1.setIcon(R.drawable.secondback);// 设置ProgressDialog标题图标
// 设置ProgressDialog 的进度条是否不明确 false 就是不设置为不明确
pd1.setIndeterminate(false);
pd1.setCancelable(true); // 设置ProgressDialog 是否可以按退回键取消
pd1.setProgress(100);// 设置ProgressDialog 进度条进度
pd1.show(); // 让ProgressDialog显示
count = 0;
new Thread() {
public void run() {
while(count &= 100) {
// 由线程来控制进度
pd1.setProgress(count++);
Thread.sleep(100);
pd1.cancel();
} catch (Exception e) {
pd1.cancel();
}.start();
//run的是实现
public void run() {
Thread.sleep(1000);//睡1秒
} catch (InterruptedException e) {
e.printStackTrace();
handler.sendEmptyMessage(0);//传送消息
//定义处理消息的对象
private Handler handler = new Handler(){
//加入传消息来了就这么么办
public void handleMessage(Message msg){
pd.dismiss();//对话框消失
Toast.makeText(SecondActivity.this, "对话框就消失了", 3).show();
// pdButton01的监听器类
class Bt1DialogListener implements DialogInterface.OnClickListener {
public void onClick(DialogInterface dialog, int which) {
// 点击“确定”按钮取消对话框
dialog.cancel();
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具09:55 提问
用android下载一个文件,在ProgressDialog显示下载进度
我正在尝试写一个简单的应用,然后应用可以进行更新。为了做成这个,我需要一个简单的功能,就是可以进行下载一个文件,同时在一个ProgressDialog显示出当前的下载进度。我知道如何做ProgressDialog,但是我不知道在同一个地方怎么既下载一个文件又显示当前的进度。
按赞数排序
有很多下载文件的方法,接下来我将贴出最常用的一些方法;究竟哪一种对你的应用来说最实用取决于你。
使用AsyncTask,在一个对话框中显示下载进度
这个方法可以让你进行后台处理的同时更新UI(在这种情况下,我们将更新一个进度条)
这是实例代码:
// 声明对话框是你activity的成员字段
ProgressDialog mProgressD
// 举例说明在onCreate中的方法
mProgressDialog = new ProgressDialog(YourActivity.this);
mProgressDialog.setMessage("A message");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute("the url to the file you want to download");
AsyncTask像这样:
// 通常,AsyncTask子类在activity类中进行声明
// 这样,你可以很容易在这里修改UI线程
private class DownloadFile extends AsyncTask&String, Integer, String& {
protected String doInBackground(String... sUrl) {
URL url = new URL(sUrl[0]);
URLConnection connection = url.openConnection();
connection.connect();
//这将是有用的,这样你可以显示一个典型的0-100%的进度条
int fileLength = connection.getContentLength();
// 下载文件
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/file_name.extension");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
output.flush();
output.close();
input.close();
} catch (Exception e) {
上边的方法(doInBackground)一直在一个后台线程中进行。你不需要做任何UI的任务。另一方面,onProgressUpdate和onPreExecute在UI线程上运行,因此你可以改变进度条
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show();
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
mProgressDialog.setProgress(progress[0]);
一旦文件已经下载完,如果你想要执行一些代码(例如mProgressDialog.dismiss()),你也可能想要重写onPostExecute方法。
2.从服务器下载
这个大的问题是:我如何从服务器上更新我的activity?在下个示例中,我们将使用两个你可能没有太注意过的类:ResultReceiver和IntentService. ResultReceiver允许我们从服务器上更新我们的线程的类,IntentService 是Service的一个子类,从那,它可以产生一个线程来处理后台任务(你应该知道,你的应用的Service在同样的进程运行;当你继承Service时,你必须手动生成新的线程来运行CPU的阻塞操作)
可以像这样:
public class DownloadService extends IntentService {
public static final int UPDATE_PROGRESS= 8344;‘
public DownloadService() {
super("DownloadService");
protected void onHandleIntent(Intent intent) {
String urlToDownload= intent.getStringExtra("url");
ResultReceiver receiver= (ResultReceiver)
intent.getParcelableExtra("receiver");
URL url= new URL(urlToDownload);
URLConnection connection= url.openConnection();
connection.connect();
// 这将是有用的,这样你可以显示一个典型的0-100%的进度条
int fileLength= connection.getContentLength();
// 下载文件
InputStream input= new BufferedInputStream(url.openStream());
OutputStream output= new FileOutputStream("/sdcard/BarcodeScanner-debug.apk");
byte data[] = new byte[1024];
long total= 0;
while ((count= input.read(data)) != -1) {
Bundle resultData= new Bundle();
resultData.putInt("progress" ,(int) (total* 100 / fileLength));
receiver.send(UPDATE_PROGRESS, resultData);
output.write(data, 0, count);
output.flush();
output.close();
input.close();
}catch (IOException e) {
e.printStackTrace();
Bundle resultData= new Bundle();
resultData.putInt("progress" ,100);
receiver.send(UPDATE_PROGRESS, resultData);
向你的manifest中加service
&service android:name=".DownloadService"/&
Activity将像这样
// 像第一个例子那样初始化进度条
//这是你怎么启动下载器
mProgressDialog.show();
Intent intent = new Intent(this, DownloadService.class);
intent.putExtra("url", "url of the file to download");
intent.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(intent);
这是ResultReceiver开始起作用
private class DownloadReceiver extends ResultReceiver{
public DownloadReceiver(Handler handler) {
super(handler);
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
if (resultCode == DownloadService.UPDATE_PROGRESS) {
int progress = resultData.getInt("progress");
mProgressDialog.setProgress(progress);
if (progress == 100) {
mProgressDialog.dismiss();
3.使用DownloadManager 类(GingerBread ,而且仅仅是最新的)
这个方法是可怕的,你不用担心手动下载文件,处理线程,数据流,等等。GingerBread有一个新的特点,DownloadManager可以让你很容易的下载文件,然后将辛苦的工作给系统做。
* @ param上下文用来检查设备的版本和DownloadManager信息
* @如果下载管理器可以用,则返回true
public static boolean isDownloadManagerAvailable(Context context) {
if (Build.VERSION.SDK_INT& Build.VERSION_CODES.GINGERBREAD) {
Intent intent= new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName("com.android.providers.downloads.ui", "com.android.providers.downloads.ui.DownloadList");
List&ResolveInfo& list= context.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() & 0;
} catch (Exception e) {
方法的名字直接就解释了。一旦你确定DownloadManager是可用的,你可以做下边这些:
String url= "url you want to download";
DownloadManager.Request request= new DownloadManager.Request(Uri.parse(url));
request.setDescription("Some descrition");request.setTitle("Some title");
// 如果为了让它运行,你必须用android3.2编译你的应用程序
if (Build.VERSION.SDK_INT&= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name-of-the-file.ext");
// 获得下载服务和队列文件
DownloadManager manager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
下载进度条将在通知栏显示结语
第一个和第二个方法仅仅是冰山一角。如果你想要你的app是健壮的,这有很多事情需要你记住。这是一个简短的列表:
你必须检查用户是否有可用的网络链接。
确定你有权限((INTERNET and
WRITE_EXTERNAL_STORAGE);如果你想要检查网络是否可用也可以用ACCESS_NETWORK_STATE
确保你要下载的文件的目录存在,有读写权限
如果下载包太大,之前的下载失败了,你可能需要实现一种方法来恢复下载
如果你允许用户中断下载,他们会很感激你。
除非你已经完全控制了下载过程,否则我强烈建议你使用DownloadManager ,它已经实现了上边列出的大部分功能。
public class EX04_17 extends Activity
private TextView mTextView01;
private Button mButton01;
private ProgressBar mProgressBar01;
public int intCounter=0;
/* 自定义Handler讯息代码,用以作为识别事件处理 */
protected static final int GUI_STOP_NOTIFIER = 0x108;
protected static final int GUI_THREADING_NOTIFIER = 0x109;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton01 = (Button)findViewById(R.id.myButton1);
mTextView01 = (TextView)findViewById(R.id.myTextView1);
/* 设定ProgressBar widget对象 */
mProgressBar01 = (ProgressBar)findViewById(R.id.myProgressBar1);
/* 调用setIndeterminate方法指派indeterminate模式为false */
mProgressBar01.setIndeterminate(false);
/* 当按下按钮后,开始线程工作 */
mButton01.setOnClickListener(new Button.OnClickListener()
public void onClick(View v)
// TODO Auto-generated method stub
/* 按下按钮让ProgressBar显示 */
mTextView01.setText(R.string.str_progress_start);
/* 将隐藏的ProgressBar显示出来 */
mProgressBar01.setVisibility(View.VISIBLE);
/* 指定Progress为最多100 */
mProgressBar01.setMax(100);
/* 初始Progress为0 */
mProgressBar01.setProgress(0);
/* 起始一个线程 */
new Thread(new Runnable()
public void run()
/* 预设0至9,共执行10次的循环叙述 */
for (int i=0;i&10;i++)
/* 成员变量,用以识别加载进度 */
intCounter = (i+1)*20;
/* 每执行一次循环,即暂停1秒 */
Thread.sleep(1000);
/* 当Thread执行5秒后显示执行结束 */
/* 以Message对象,传递参数给Handler */
Message m = new Message();
/* 以what属性指定User自定义 */
m.what = EX04_17.GUI_STOP_NOTIFIER;
EX04_17.this.myMessageHandler.sendMessage(m);
Message m = new Message();
m.what = EX04_17.GUI_THREADING_NOTIFIER;
EX04_17.this.myMessageHandler.sendMessage(m);
catch(Exception e)
e.printStackTrace();
).start();
/* Handler建构之后,会聆听传来的讯息代码 */
Handler myMessageHandler = new Handler()
// @Override
public void handleMessage(Message msg)
switch (msg.what)
/* 当取得识别为 离开线程时所取得的讯息 */
case EX04_17.GUI_STOP_NOTIFIER:
/* 显示执行终了 */
mTextView01.setText(R.string.str_progress_done);
/* 设定ProgressBar Widget为隐藏 */
mProgressBar01.setVisibility(View.GONE);
Thread.currentThread().interrupt();
/* 当取得识别为 持续在线程当中时所取得的讯息 */
case EX04_17.GUI_THREADING_NOTIFIER:
if(!Thread.currentThread().isInterrupted())
mProgressBar01.setProgress(intCounter);
/* 将显示进度显示于TextView当中 */
mTextView01.setText ( getResources().getText(R.string.str_progress_start)+
"("+Integer.toString(intCounter)+"%)\n"+
"Progress:"+
Integer.toString(mProgressBar01.getProgress())+
"\n"+"Indeterminate:"+
Boolean.toString(mProgressBar01.isIndeterminate()) );
super.handleMessage(msg);
在线程的try里进行文件下载操作~
如果你要从网络上下载东西,不要忘记给你的manifest文件添加许可
&manifest xmlns:android="/apk/res/android"
package="com.example.helloandroid"
android:versionCode="1"
android:versionName="1.0"&
&uses-sdk android:minSdkVersion="10" /&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"&&/uses-permission&
&uses-permission android:name="android.permission.INTERNET"&&/uses-permission&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"&&/uses-permission&
&uses-permission android:name="android.permission.READ_PHONE_STATE"&&/uses-permission&
&application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"&
&/application&
其他相似问题本文讲的是Android编程实现加载等待ProgressDialog的方法_Android,
本文实例讲述了Android编程实现加载等待ProgressDialog的方法。分享给大家供大家参考,具体如下:
显示progressDialog的类:
import android.app.ProgressD
本文实例讲述了Android编程实现加载等待ProgressDialog的方法。分享给大家供大家参考,具体如下:
显示progressDialog的类:
import android.app.ProgressD
import android.content.C
import android.content.DialogI
import android.content.DialogInterface.OnCancelL
public class ShowProgressDialog {
public static ProgressD
public static void show(Context context,String msg,Thread thread) {
final Thread th =
wait = new ProgressDialog(context);
//设置风格为圆形
wait.setProgressStyle(ProgressDialog.STYLE_SPINNER);
wait.setTitle(null);
wait.setIcon(null);
//设置提示信息
wait.setMessage(msg);
//设置是否可以通过返回键取消
wait.setCancelable(true);
wait.setIndeterminate(false);
//设置取消监听
wait.setOnCancelListener(new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
th.interrupt();
wait.show();
调用的时候显示progressDialog作为主线程,另起线程进行业务处理,等到业务处理完调用ShowProgressDialog.wait.dismiss();关闭progressDialog。处理完如需提示信息,直接在业务线程中是不行的,需要通过Handler实现线程和activity的交互
希望本文所述对大家Android程序设计有所帮助。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
progressdialog
progressdialog、progressdialog样式、自定义progressdialog、progressdialog不显示、qprogressdialog,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
的信息,还有progressdialog、progressdialog样式、自定义progressdialog、progressdialog不显示、qprogressdialog等
,所有相关内容均不代表云栖社区的意见!Android 之 ProgressDialog用法介绍 - Sunzone - ITeye博客
博客分类:
布局文件测试:
&LinearLayout xmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/cricle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="圆形进度条测试" /&
android:id="@+id/rec"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="长形进度条测试" /&
&/LinearLayout&
测试代码入口:
package com.example.
import android.app.A
import android.app.ProgressD
import android.content.DialogI
import android.content.DialogInterface.OnClickL
import android.os.B
import android.util.L
import android.view.V
import android.widget.B
public class MainActivity extends Activity {
private ProgressDialog myD
int count = 0;// 存储进度条当前值,初始为 0
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取对象
circle = (Button) findViewById(R.id.cricle);
rec = (Button) findViewById(R.id.rec);
// 圆形按钮测试
circle.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 矩形进度条测试
rec.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
* 圆形进度条测试..
public void circle() {
myDialog = new ProgressDialog(MainActivity.this); // 获取对象
myDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // 设置样式为圆形样式
myDialog.setTitle("友情提示"); // 设置进度条的标题信息
myDialog.setMessage("数据加载中,请稍后..."); // 设置进度条的提示信息
myDialog.setIcon(R.drawable.ic_launcher); // 设置进度条的图标
myDialog.setIndeterminate(false); // 设置进度条是否为不明确
myDialog.setCancelable(true); // 设置进度条是否按返回键取消
// 为进度条添加确定按钮 , 并添加单机事件
myDialog.setButton("确定", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
myDialog.cancel(); // 撤销进度条
myDialog.show(); // 显示进度条
* 矩形进度条测试...
public void rec() {
myDialog = new ProgressDialog(MainActivity.this); // 得到一个对象
myDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 设置为矩形进度条
myDialog.setTitle("提示");
myDialog.setMessage("数据加载中,请稍后...");
myDialog.setIcon(R.drawable.ic_launcher);
myDialog.setIndeterminate(false); // 设置进度条是否为不明确
myDialog.setCancelable(true);
myDialog.setMax(200); // 设置进度条的最大值
myDialog.setProgress(0); // 设置当前默认进度为 0
myDialog.setSecondaryProgress(1000); // 设置第二条进度值为100
// 为进度条添加取消按钮
myDialog.setButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
myDialog.cancel();
myDialog.show(); // 显示进度条
new Thread() {
public void run() {
while (count &= 200) {
myDialog.setProgress(count++);
Thread.sleep(100);
//暂停 0.1秒
} catch (Exception e) {
Log.i("msg","线程异常..");
}.start();
(894.4 KB)
下载次数: 48
浏览: 336032 次
来自: 武汉
浏览量:9842
浏览量:208651
浏览量:10004
浏览量:11872
[color=red][
size=xx-small ...
小伙子,很有前途哦
dugujiujian 写道R.layout.simple_s ...
R.layout.simple_spinner_dropdow ...

我要回帖

更多关于 progressdialog样式 的文章

 

随机推荐