博观而约取,厚积而薄发。这篇文章主要讲述android ——多线程编程相关的知识,希望能为你提供帮助。
【android ——多线程编程】1、定义一个线程只需要新建一个类继承自Thread。然后重写run()方法,并在里面编写耗时逻辑即可:
class MyThread extends Thread{public void run(){ //处理具体的逻辑 } }
启动的时候只需要new出MyThread的实例,然后调用它的start()方法,这样run()中写的代码就会在子线程中进行:
new Mythread().start();
2、更多时候使用实现Runnable接口的方式来定义一个线程
class MyThread implements Runnable {public void run() { //处理具体的逻辑 } }
如果使用了这种写法,启动线程的方法也要进行相应的改变:
MyThread mythread = new MyThread(); new Thread(mythread).start();
Thread的构造函数接收了一个Runnable参数,MyThread正是一个实现了Runnable接口的对象,所以直接将它传入Thread的构造函数里,紧接着调用start()方法,run()中的代码就会在子线程中运行了。
3、如果不想专门再定义一个类去实现Runnable接口,也可以使用匿名类的方式:
new Thread (new Runnable() {public void run() { //处理具体的逻辑 } }).start();
例如:在子线程中更新UI,
android的UI是线程不安全的,也就是说如果想要更新应用程序里的UI元素,就必须要在主线程中进行,否则就会出现意外。
验证一下就是:先在布局中加入一个按钮和一个文本控件,
1 < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2android:layout_width="match_parent" 3android:layout_height="match_parent"> 4 5 6< Button 7android:id="@+id/chage_text" 8android:layout_width="match_parent" 9android:layout_height="wrap_content" 10android:text="改变文字" /> 11 12< TextView 13android:id="@+id/textView" 14android:layout_width="wrap_content" 15android:layout_height="wrap_content" 16android:layout_centerInParent="true" 17android:text="这是一段文字" 18android:textSize="20sp"/> 19 < /RelativeLayout>
然后是java代码:
1 public class MainActivity extends AppCompatActivity { 2@Override 3protected void onCreate(Bundle savedInstanceState) { 4super.onCreate(savedInstanceState); 5setContentView(R.layout.activity_main); 6 7//注册按钮和文本控件 8Button changeText = (Button) findViewById(R.id.chage_text); 9final TextView textView = (TextView) findViewById(R.id.textView); 10 11//按钮响应 12changeText.setOnClickListener(new View.OnClickListener() { 13@Override 14public void onClick(View view) { 15 16//开启一个子线程 17new Thread(new Runnable() { 18@Override 19public void run() { 20 21//修改文本控件中的文本 22textView.setText("这是另一段文字"); 23} 24}).start(); 25} 26}); 27} 28 }
然后安装到手机上,然后就崩溃了,前面就说过要改变UI就需要在主线程中去改变。这时候就需要使用一套异步消息处理机制,也就是子线程中发送消息给Handler,然后Handler识别消息再去进行相应的操作。
1 public class MainActivity extends AppCompatActivity { 2 3public static final int UPDATA_TEXT = 1; 4 5private TextView textView; 6 7private Handler handler = new Handler(){ 8 9public void handleMessage(Message msg){ 10switch (msg.what){ 11case UPDATA_TEXT: 12textView.setText("这是另一段文字"); 13break; 14default: 15break; 16} 17} 18}; 19@Override 20protected void onCreate(Bundle savedInstanceState) { 21super.onCreate(savedInstanceState); 22setContentView(R.layout.activity_main); 23 24//注册按钮和文本控件 25Button changeText = (Button) findViewById(R.id.chage_text); 26textView = (TextView) findViewById(R.id.textView); 27 28//按钮响应 29changeText.setOnClickListener(new View.OnClickListener() { 30@Override 31public void onClick(View view) { 32 33//开启一个子线程 34new Thread(new Runnable() { 35@Override 36public void run() { 37Message message = new Message(); 38message.what = UPDATA_TEXT; 39handler.sendMessage(message); //将Message对象发送出去 40} 41}).start(); 42} 43}); 44} 45 }
先创建一个Handler对象,并重写handleMessage方法用于对具体Message的处理,在这里对UI进行改变,然后在子线程中创建一个Message对象,将Message的what字段指定为提取设置好的值,然后调用handler的sendMessage()方法发送出去。
推荐阅读
- Android 7.0Power 按键处理流程
- Android开发之动态设置字体的样式和粗细
- POJ 2385 -- Apple Catching
- 解决Android中,禁止ScrollView内的控件改变之后自动滚动 - 转
- Android——Activity以及Service的启动方式
- 钟情平台化的锁屏赚钱APP如何重塑现象级市场()
- xamarin.android 绑定百度地图SDK遇到的问题
- Android 混淆后的代码调试
- WinForm中Application.Idle事件用法