Android开发之ProgressDialog的使用

ProgressDialog类似于ProgressBar类。

用于显示一个过程,通常用于耗时操作。


几个方法介绍:

1.setMax()

设置对话框中进度条的最大值。

2.setTile()

设置标题。

3.setProgressStyl()

设置对话框中进度条的样式。例如:环形和水平。

参数:

ProgressDialog.STYLE_SPINNER    环形精度条

ProgressDialog.STYLE_HORIZONTAL     水平样式的进度条

4.setMessage()

设置显示的内容。


演示实例:

用于模拟一个耗时的连接操作。

图:

技术分享   技术分享技术分享

MainActivity.java

public class MainActivity extends Activity {

	Button button, button2;
	ProgressDialog progressDialog;
	public final static String ABOUT_SERVER = "Connect";

	// 信息广播接收
	BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context c, Intent intent) {

			String str = intent.getStringExtra("DATA");

			if (str.equals("0")) {
				progressDialog.setMessage("开始连接");

			} else if (str.equals("1")) {
				progressDialog.setMessage("连接完毕");
			} else {
				progressDialog.dismiss();

			}
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 注册广播监听
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(ABOUT_SERVER);
		registerReceiver(broadcastReceiver, intentFilter);

	}

	public void click(View v) {

		progressDialog = new ProgressDialog(MainActivity.this);
		progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		progressDialog.setMessage("准备建立连接·············");
		progressDialog.show();
		Intent intent = new Intent(MainActivity.this, ServerActivity.class);
		startService(intent);
	}

}
activity_main.xml

<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:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="点击" />
    

</LinearLayout>
ServerActivity.java

public class ServerActivity extends Service {

	Handler handler = new Handler() {
		public void handleMessage(Message msg) {

			Intent intent = new Intent(MainActivity.ABOUT_SERVER);
			if (msg.what == 0) {
				intent.putExtra("DATA", "0");

			} else if (msg.what == 1) {
				intent.putExtra("DATA", "1");

			} else {
				intent.putExtra("DATA", "2");
				ServerActivity.this.stopSelf();
			}
			sendBroadcast(intent);

		};

	};

	@Override
	public void onCreate() {
		super.onCreate();

		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				// 要做的事
				try {
					for (int i = 0; i < 3; i++) {
						Thread.sleep(1000);
						Message message = new Message();
						message.what = i;
						handler.sendMessage(message);
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		});
		thread.start();

	}

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

}
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        
        <service android:name="com.example.test.ServerActivity"></service>
        
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

在做此实例时,遇到报错,一大串红字,最关键的一句话:

This message is already in use.

从网上查得:与handler发送Message相关,消息已经在消息队列了,而且正被使用,而如果往同一个队列发送相同的对象就会报错。
造成这个错误是因为:
final Message message = new Message();

		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				// 要做的事
				try {
					for (int i = 0; i < 3; i++) {
						Thread.sleep(1000);
						message.what = i;
						handler.sendMessage(message);
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		});
		thread.start();
使用了同一个Message。用的API 19(4.4)与4.4模拟器,不显示错误,只是卡住,用的API 19(4.4)与2.2模拟器就报错了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。