Android线程的三种用法和子线程更新UI两种用法
2016-07-10 19:10
537 查看
一. 三种开启线程的方式
1.
2.
3.
个人比较喜欢第三种形式,简单粗暴.
二.子线程更新UI的两种方法(我记得好像在子线程里面能直接更新和进度相关的UI,还有哪些忘了,以后在继续添加)
1.用Handler,进行异步消息处理机制,事例部分代码如下:
2.使用AsyncTask更新UI,事例部分代码如下:
由于AsyncTask是抽象类,所以拿个类要去继承它,AsyncTask有三个泛型参数,
第一个参数代表在执行时需要传入的参数,用于在后台任务中使用.
第二个参数,代表如果需要在界面上显示当前的进度,泛型为进度单位,
第三个参数,代表任务执行完毕后,如果需要对结果进行返回,则泛型为返回值类型
这里需要注意的时重写的四个方法
1.onPreExecute:在开始执行之前调用,一般用作初始化
2.doInBackground:编写耗时操作的代码常常与publishProgress一起使用
3.onProgressUpdate:回应publishProgress,可以更新UI
4.onPostExecute:最后返回时调用,用作扫尾工作
这里主要是对publishProgress这个函数的理解,可以理解为事件,一旦调用便是触发了一个onProgressUpdate事件.
1.
class MyThread extends Thread{ @Override public void run() { //处理具体逻辑 } } new MyThread().start();
2.
class MyThread implements Runnable{ @Override public void run() { //处理具体逻辑 } } MyThread myThread = new MyThread(); new Thread(myThread).start();
3.
new Thread(new Runnable() { @Override public void run() { //处理具体逻辑 } }).start();
个人比较喜欢第三种形式,简单粗暴.
二.子线程更新UI的两种方法(我记得好像在子线程里面能直接更新和进度相关的UI,还有哪些忘了,以后在继续添加)
1.用Handler,进行异步消息处理机制,事例部分代码如下:
package com.example.mengxin.androidthreadtest; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView wenzi; private static final int UPDATE_TEXT = 1; private Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case UPDATE_TEXT: wenzi.setText("sss"); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button) findViewById(R.id.change_text); wenzi = (TextView) findViewById(R.id.wenzi); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Thread(new Runnable() { @Override public void run() { Message message = new Message(); message.what = UPDATE_TEXT; handler.sendMessage(message); } }).start(); } }); } }
2.使用AsyncTask更新UI,事例部分代码如下:
package com.example.mengxin.androidthreadtest; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import android.widget.Toast; import static android.widget.Toast.LENGTH_LONG; public class MainActivity extends AppCompatActivity { private TextView wenzi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); wenzi = (TextView) findViewById(R.id.wenzi); new AsyncTaskTest().execute(); } class AsyncTaskTest extends AsyncTask<Void, Integer, Boolean> { @Override protected void onPreExecute() { wenzi.setText("使用AsyncTask!!!"); } @Override protected Boolean doInBackground(Void... voids) { for(int i=0; i<3; i++){ try { Thread.sleep(2000); publishProgress(i); } catch (InterruptedException e) { e.printStackTrace(); return false; } } return true; } @Override protected void onProgressUpdate(Integer... values) { System.out.println(values[0]); switch (values[0]){ case 0: wenzi.setText("00000"); break; case 1: wenzi.setText("11111"); break; case 2: wenzi.setText("22222"); break; default : break ; } } @Override protected void onPostExecute(Boolean aBoolean) { if(aBoolean){ Toast.makeText(MainActivity.this, "结束了", LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "失败了", LENGTH_LONG).show(); } } } }
由于AsyncTask是抽象类,所以拿个类要去继承它,AsyncTask有三个泛型参数,
第一个参数代表在执行时需要传入的参数,用于在后台任务中使用.
第二个参数,代表如果需要在界面上显示当前的进度,泛型为进度单位,
第三个参数,代表任务执行完毕后,如果需要对结果进行返回,则泛型为返回值类型
这里需要注意的时重写的四个方法
1.onPreExecute:在开始执行之前调用,一般用作初始化
2.doInBackground:编写耗时操作的代码常常与publishProgress一起使用
3.onProgressUpdate:回应publishProgress,可以更新UI
4.onPostExecute:最后返回时调用,用作扫尾工作
这里主要是对publishProgress这个函数的理解,可以理解为事件,一旦调用便是触发了一个onProgressUpdate事件.
相关文章推荐
- UE中使用正则表达式的一些技巧
- Building an MFC project for a non-Unicode character set is deprecated
- GPUImage使用
- 关于android stuidio的基本设置
- 【SSH进阶】Field 'id' doesn't have a default value
- Codeforces Round #279 (Div. 2) B. Queue
- leetcode60. Permutation Sequence
- php实现简单的SQL Builder
- 【荐】如何正确理解PHP之include,include_once,require,require_once等包含作用域
- map按key和value排序
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
- 数据库交互 query
- leetcode357. Count Numbers with Unique Digits
- 特殊权限-SUID,SGID,Sticky 学习笔记
- Mysql插入数据里有中文字符出现Incorrect string value的错误
- $_SERVER["SCRIPT_NAME"]、$_SERVER["PHP_SELF"]、$_SERVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]
- TI BIOS MCSDK 2.0 User Guide
- CSS链接四种状态注意顺序、UI伪类选择器的顺序
- UIView的layoutSubviews和drawRect