1.Handler异步方式的实现
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)运行并生成 Looper获取Message并传递给Handler逐个获取Looper中的Message,并进行UI变更。Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例都会绑定到他创建的线程中。
Handler中分发消息的一些办法
handler.post(Runnable );将Runnable直接添加入队列
handler.postDelayed(Runnable, long)延迟一定时间后,将Runnable添加入队列
handler.postAtTime(Runnable,long)定时将Runnable添加入队列
终止线程:handler.removeCallbacks(thread);将Runnable从Runnable队列中取出
public class HandlerActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mText1;
private Button mBtn1;
private static final int UPDATE_TEXT = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handler_activity);
mText1 = (TextView)findViewById(R.id.text1);
mBtn1 = (Button)findViewById(R.id.button1);
mBtn1.setOnClickListener(this);
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case UPDATE_TEXT:
mText1.setText("Bye");
break;
default:
break;
}
}
};
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
break;
default:
break;
}
}
}
2.AsyncTask异步方式的实现
AsyncTask定义了三种泛型类型 Params,Progress和Result。
①Params 启动任务执行的输入参数,比如HTTP请求的URL。
②Progress 后台任务执行的百分比。
③Result 后台执行任务最终返回的结果,比如String。
AsyncTask的四个重要方法:
①onPreExecute(),在UI线程中执行,它会在异步任务开始前执行,一般用来设置任务参数;
②doInBackground, 最重要的方法,在子线程中执行(事实上,只有它在子线程中执行,其他方法都在UI线程中执行)。当onPreExecute结束后,本方法立刻执行,它用来进行后台的耗时计算,异步任务的参数会被传给它,执行完成的结果会被送给第四步;执行途中,它还可以调用publishProgress 方法来通知UI线程当前执行的进度;
③onProgressUpdate, 当publishProgress 被调用后,它在UI线程中执行,刷新任务进度,一般用来刷新进度条等UI部件;
④onPostExecute, 当后台的异步任务完成后,它会在UI线程中被调用,并获取异步任务执行完成的结果。
public class MainActivity extends AppCompatActivity {
private TextView mText;
private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText = (TextView)findViewById(R.id.text);
mBtn = (Button)findViewById(R.id.button);
mBtn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View view) {
update();
}
});
}
private void update() {
DownloadTask downloadTask = new DownloadTask(this);
downloadTask.execute();
}
public class DownloadTask extends AsyncTask<Void,Integer,Boolean> {
private Context context;
DownloadTask(Context context) {
this.context = context;
}
@Override
protected void onPreExecute(){
Toast.makeText(context,"开始执行",Toast.LENGTH_SHORT).show();
}
@Override
protected Boolean doInBackground(Void... params){
int i = 0;
try{
while(true){
i++;
publishProgress(i);
try{
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
if(i >= 100){
break;
}
}
}catch (Exception e){
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
mBtn.setText("下载完成");
mBtn.setEnabled(false);
Toast.makeText(context,"执行完毕",Toast.LENGTH_SHORT).show();
}
@Override
protected void onProgressUpdate(Integer... values) {
//progressBar.setProgress(values[0]);
mText.setText("下载中"+values[0]+"%");
// mText.setText("Hello");
}
}
}