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