android异步操作

        因为一次偶然的机会让我对移动开发产生了浓厚的兴趣,于是就把mars老师的四季的视频全都下载了下来开始自学android,之前看视频自学一直也没写过博客,现在也看到了第四季就想写一写博客分享一下我的学习经历。

        1、要实现异步操作就要用到android提供一个AsyncTask类,这个类是一个泛型。下面附上我的代码,我直接在代码中说明

package com.example.async2;

import android.os.AsyncTask;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * 1、继承AsyncTask<E1, E2, E3>,其中E1,E2,E3分别是三个类型
 * 2、必须要重写的方法是doInBackground方法
 * 3、第一个类型对应doInBackground方法的参数类型
 * 4、第二个类型对应于onProgressUpdate方法的参数类型
 * 5、第三个对应于onPostExecute方法的参数类型
 * 6、在生成该类的对象来实现异步操作的时候要调用execute方法
 * 7、调用该方法之后首先执行的是onPreExecute方法,然后执行doInBackground方法,最后执行onPostExecute方法
 * 
 * @author why
 * 
 */
public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {

	// UI线程中的文本框控件
	private TextView textView = null;
	// UI线程中的进度条控件
	private ProgressBar progressBar = null;

	public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
		this.textView = textView;
		this.progressBar = progressBar;
	}

	/**
	 * 改方法不运行在UI线程之中,所以在该方法中不能对UI中的控件进行操作
	 * 执行一些耗时较长的方法
	 */
	@Override
	protected String doInBackground(Integer... params) {
		// TODO Auto-generated method stub
		NetOperator operator = new NetOperator();
		int i = 0;
		for (i = 10; i < 100; i += 10) {
			operator.operator();
			publishProgress(i);
		}
		return i + "";
	}

	/**
	 * 该方法运行在UI线程中实现对UI线程中的控件的一些操作
	 */
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
        // 设置控件可见
		textView.setVisibility(View.VISIBLE);
		progressBar.setVisibility(View.VISIBLE);
		textView.setText("开始进行异步操作");
	}

	/**
	 * 该方法运行在UI线程中实现对UI线程中的控件的一些操作
	 */
	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		textView.setText("异步操作结束" + result);
		progressBar.setVisibility(View.GONE);
	}

	/**
	 * 1、该方法运行在UI线程中实现对UI线程中的控件的一些操作
	 * 2、在doInBackground方法中每次调用publishProgress都会触发这个方法的执行
	 */
	@Override
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		progressBar.setProgress(values[0]);
	}

}

         2、主界面Activity

package com.example.async2;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * 主界面,有TextView,ProgressBar和Button三个控件
 * @author why
 *
 */
public class MainActivity extends Activity {

	private TextView textView = null;
	private ProgressBar progressBar = null;
	private Button button = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		// 设置布局文件
		setContentView(R.layout.acttivity_main);

		// 通过ID获取控件
		textView = (TextView) findViewById(R.id.textView);
		progressBar = (ProgressBar) findViewById(R.id.progressbar);
		button = (Button) findViewById(R.id.button1);

		// 给button绑定监听器
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				ProgressBarAsyncTask task = new ProgressBarAsyncTask(textView, progressBar);
				task.execute(1000);
			}
		});
	}

}

         3、NetOperator模拟执行时间较长的一些操作

package com.example.async2;

/**
 *
 * @author why
 *
 */
public class NetOperator {

	public void operator() {
		try {
			// 将当前线程休眠,模拟执行时间较长的操作
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

         4、布局文件,很简单只有三个控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <ProgressBar
        android:id="@+id/progressbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:visibility="gone" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button1" />

</LinearLayout>

相关推荐