您的位置:首页 > 移动开发 > Android开发

Android线程阻塞解决方案(二)

2015-11-10 18:18 344 查看
既然Android的不同意使用子线程来进行数据设置,那么我们就耗时操作完成后再进行数据操作,查看官方API,官方说使用

1.View.post

2.AsyncTask

我们先用post测试使用一下

public class MainActivity extends Activity {
	private Button yidongBtn=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		yidongBtn=(Button)findViewById(R.id.yidongBtn);
		//给btn设置动画
		TranslateAnimation animation=new TranslateAnimation(0,1500,0,0);
		animation.setRepeatCount(20);
		animation.setDuration(2000);
		yidongBtn.setAnimation(animation);
		
		final Button btn2=(Button)findViewById(R.id.btn2);
		btn2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(final View v) {
				//1.不要阻塞UI线程(这里我不阻塞线程,我重新new线程)
				System.out.println("new子线程开始执行...");
				new Thread(new Runnable() {
					@Override
					public void run() {
						//设置其耗时操作
						try {
							Thread.sleep(5000);
						} catch (InterruptedException e) {
							Log.i("耗时操作",e.getMessage());
						}
						v.post(new Runnable() {
							@Override
							public void run() {
								int sum=10;
								btn2.setText("计数:"+sum);
								System.out.println("View.post视图post被执行了....");
							}
						});
						System.out.println("new子线程执行结束...");
					}
				}).start();
			}
		});
	}
我们检测一下这个执行过程,发现打印的顺序是:




这个过程说明了我们的赋值操作是在线程执行完成后进行的,又根据Android官方的API提出的观点来讲,这说明一定有一个“第三者”充当传达命令角色:主线程分配任务给“第三者”,子线程从“第三者”中去取抓取任务。

(其实第三者就是Handler)

由于上面的代码可读性差,代码冗余,所以官方对这段代码进行封装

private Button yidongBtn=null;
	private Button btn2=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		yidongBtn=(Button)findViewById(R.id.yidongBtn);
		//给btn设置动画
		TranslateAnimation animation=new TranslateAnimation(0,1500,0,0);
		animation.setRepeatCount(20);
		animation.setDuration(2000);
		yidongBtn.setAnimation(animation);
		
		btn2=(Button)findViewById(R.id.btn2);
		btn2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				new ChangeAnsyncTask().execute();
			}
		});
		/**
		btn2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(final View v) {
				//1.不要阻塞UI线程(这里我不阻塞线程,我重新new线程)
				System.out.println("UI线程Id:"+Thread.currentThread().getId());
				System.out.println("new子线程开始执行...");
				new Thread(new Runnable() {
					@Override
					public void run() {
						//设置其耗时操作
						try {
							Thread.sleep(5000);
						} catch (InterruptedException e) {
							Log.i("耗时操作",e.getMessage());
						}
						v.post(new Runnable() {
							@Override
							public void run() {
								int sum=10;
								btn2.setText("计数:"+sum);
								System.out.println("View.post视图post被执行了....");
							}
						});
						System.out.println("new子线程执行结束...");
					}
				}).start();
			}
		});
		**/
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public class ChangeAnsyncTask extends AsyncTask<String, Void, Integer>{
		protected Integer doInBackground(String... params) {
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			int sum=10;
			return sum;
		}

		@Override
		protected void onPostExecute(Integer result) {
			btn2.setText("变形:"+result);
			super.onPostExecute(result);
		}
	}
很明显上面的代码松耦合,对线程阻塞问题有限的代码封装,更有利于实际开发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: