Android中的多线程主要分为两类:主线程与子线程
两个原则:
程序例子,写一个耗时操作,假设从网络获取了字符串
private String getStringFormNet(){
//假设从网络获取了字符串
String result = ''
StringBulider stringBulider = new StringBulider();
//模拟一个耗时操作
for(int i=0,i<100,i++){
stringBulider.append("字符串"+i)
}
try{
//此处休眠5s
Thread.sleep(5000):
}
catch(InterruptedException e){
e.printStackTrace();
}
result = stringBulider.toString();
return result;
}
假设主线程来运行上面耗时操作
public class MainActivity extends AppCompatActivity{
private TextView tvContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvContent = findViewById(R.id.tv_content);
}
public void start(View view){
//做一个耗时任务
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
String stringFormNet = getStringFormNet();
tvContent.setText(stringFormNet();
}
});
thread.start();
Toast.makeText(this,"任务完成!",Toast.LENGTH_SHORT).show();
}
private String getStringFormNet(){
//假设从网络获取了字符串
String result = ''
StringBulider stringBulider = new StringBulider();
//模拟一个耗时操作
for(int i=0,i<100,i++){
stringBulider.append("字符串"+i)
}
try{
//此处休眠5s
Thread.sleep(5000):
}
catch(InterruptedException e){
e.printStackTrace();
}
result = stringBulider.toString();
return result;
}
}
运行结果,直接显示"任务完成!"然后退出进程,说明主进程无法直接运行耗时操作!
Handler异步通信系统
程序例子,用Handler来进行子线程和主线程的通信,子线程来执行耗时操作,并显示字符串
public class MainActivity extends AppCompatActivity{
private TextView tvContent;
//此处写一个handler程序
private Handler mHandler = new Handler(Looper.myLooper()){
@Override
public void handleMessage(@NonNull Message msg){
super.handlerMessage(msg);
if(msg.what==0){
String strData = (String)msg.obj;
tvContent.setText(strData);
Toast.makeText(MainActivity.this,"主线程收到消息了!",Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvContent = findViewById(R.id.tv_content);
}
public void start(View view){
//做一个耗时任务
new Thread(new Runnable(){
@Override
public void run(){
String stringFormNet = getStringFormNet();
//使用handler来发送消息
Message message = new Message();
message.what = 0;//用于区分是谁发的消息
message.obj = stringFormNet;
mHandler.sendMessage(meaasge);
}
}).start();
Toast.makeText(MainActivity.this,"任务完成!",Toast.LENGTH_SHORT).show();
}
private String getStringFormNet(){
//假设从网络获取了字符串
String result = ''
StringBulider stringBulider = new StringBulider();
//模拟一个耗时操作
for(int i=0,i<100,i++){
stringBulider.append("字符串"+i)
}
try{
//此处休眠5s
Thread.sleep(5000):
}
catch(InterruptedException e){
e.printStackTrace();
}
result = stringBulider.toString();
return result;
}
}
运行结果,先显示"任务完成!“,然后等待5s后显示字符串内容和"主线程收到消息了!”!