Android中的异步任务和多线程任务

1.同步任务与异步任务

  • 同步:在执行任务时,如果没有受到执行结果,就一直等,不继续下去执行,知道收到执行结果,再继续往下执行
  • 异步:在执行程序时,如果遇到需要等待的任务,就零开辟一个子线程去执行,自己继续往下执行其他程序。子线程有结果时,会将结果发送给主线程

2.Android中的多线程

  • 线程:通俗点讲就是一个执行过程。多线程,自然就是多个执行过程。

Android中的多线程主要分为两类:主线程与子线程

  • APP一启动,本身就是一个线程,这个线程被称为主线程mainThread,负责显示界面,跟用户交互。
    界面通常被称为UI(User Interface),主线程也被称为UI线程。
  • 其余为子线程

两个原则:

  • 主线程不能执行网络请求/文件读写等耗时操作
  • 子线程不能执行UI刷新

程序例子,写一个耗时操作,假设从网络获取了字符串

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;
	}
}

运行结果,直接显示"任务完成!"然后退出进程,说明主进程无法直接运行耗时操作!

3.Android多线程通信-Handler机制

Handler异步通信系统

  • Handler机制主要的几个角色:Handler、Message、Loop、MessageQueue(消息队列)

程序例子,用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后显示字符串内容和"主线程收到消息了!”!

你可能感兴趣的:(Android,Studio,android,ui,java)