欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android异步操作

程序员文章站 2022-03-13 22:43:50
...

        因为一次偶然的机会让我对移动开发产生了浓厚的兴趣,于是就把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>