目录
android中的线程使用
1.线程
1.1.继承Thread
class MyThread extends Thread {
@Override
public void run() {
//子线程
Log.d("TAG", "开启了线程");
}
}
启动:
new MyThread().start();
1.2.实现Runnable接口
使用继承耦合有些高,更过的时候我们使用实现Runnable接口的方式
class MyThread1 implements Runnable {
@Override
public void run() {
//子线程
Log.d("TAG", "开启了线程1");
}
}
启动:
MyThread1 mythread1 = new MyThread1();
new Thread(mythread1).start();
1.3.匿名类
如果不想要去实现Runnabe接口也可以使用匿名内部类
//使用匿名类Runnable
new Thread(new Runnable() {
@Override
public void run() {
//子线程
}
}).start();
以上三种就是android中常用多线程的用法。
因为android子线中不允许更新UI ,更新UI会报错:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
这时候需要从主线程更新:
2.更新
2.1.通过runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("MyThread1");
}
2.2.handler
public static final int TAG = 1;
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case TAG:
textView.setText("匿名内部类");
break;
}
}
};
Message message = new Message();
message.what = TAG;
handler.sendMessage(message);
2.3.view.post()
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("MyThread");
}
});
2.4.handler.post()
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("MyThread");
}
});
2.5.AsyncTask
见:https://blog.youkuaiyun.com/qq_35698774/article/details/107394945
完整代码:
package com.example.mythred;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.media.ImageReader;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
public static final int TAG = 1;
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case TAG:
textView.setText("匿名内部类");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.tv);
Button button = findViewById(R.id.button);
Button button1 = findViewById(R.id.button1);
Button button2 = findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启MyThread线程
new MyThread().start();
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启Mythread线程
MyThread1 mythread1 = new MyThread1();
new Thread(mythread1).start();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//使用匿名类Runnable
new Thread(new Runnable() {
@Override
public void run() {
//子线程
Log.d("TAG", "开启匿名内部类线程");
// textView.setText("匿名内部类");
Message message = new Message();
message.what = TAG;
handler.sendMessage(message);
}
}).start();
}
});
}
class MyThread extends Thread {
@Override
public void run() {
//子线程
Log.d("TAG", "开启了线程");
// textView.setText("MyThread");
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("MyThread");
}
});
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("MyThread");
}
});
}
}
class MyThread1 implements Runnable {
@Override
public void run() {
//子线程
Log.d("TAG", "开启了线程1");
// textView.setText("MyThread1");
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("MyThread1");
}
});
}
}
}
转发表明出处:https://blog.youkuaiyun.com/qq_35698774/article/details/107371829
android互助群: