Android多线程与异步任务学习笔记(一)

多线程中的一些关键字

Runnable  
Thread
ThreadPoolExecutor
ScheduleExecutor

关于线程同步的关键字

Synchronized
Lock


--------------------------------------------------------------------分割线--------------------------------------------------------------------------------

为什么使用多线程

IO操作(文件操作,网络操作,数据库操作...)
复杂操作
定时运算

综上,耗时的操作(一般超过50ms的操作)都建议用多线程处理,避免主线程(UI线程)阻塞。

如何使用多线程或异步操作(不一定是多线程)

Thread
Handler
AsyncTask
AsyncTaskLoader (Android3.0之后)  ---  有个子类 CursorLoader 可以方便的用于操作数据库与UI的交互。



--------------------------------------------------------------------分割线--------------------------------------------------------------------------------
//代码
	ImageView mImageView = null;
	private final String IMAGE_URL = "http://b.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=02b2417e8744ebf8797c6c6db890bc4f/fc1f4134970a304e4ccdd887d1c8a786c8175cdb.jpg";

	// 异步任务类AsyncTask,实现网络图片的下载,显示与ImageView
	private class DownloadImageTask extends AsyncTask<String, Void, Drawable> {

		@Override
		protected Drawable doInBackground(String... arg0) {
			// TODO Auto-generated method stub
			return getDrawableFromNet(arg0[0]);
		}

		@Override
		protected void onPostExecute(Drawable result) {
			// TODO Auto-generated method stub
			mImageView.setImageDrawable(result);
		}

	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mImageView = (ImageView) findViewById(R.id.imageContent);

		// 所有的操作都放在UI线程里面,造成线程的阻塞,较新版本的Android会抛出NetWorkOnMainThreadException的异常
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Drawable drawable = getDrawableFromNet(IMAGE_URL);
				mImageView.setImageDrawable(drawable);
			}
		});

		// 在一个新的线程中处理UI线程的ImageView,会抛出异常。线程不安全
		findViewById(R.id.button2).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				new Thread(new Runnable() {

					@Override
					public void run() {
						// TODO Auto-generated method stub
						Drawable drawable = getDrawableFromNet(IMAGE_URL);
						mImageView.setImageDrawable(drawable);
					}
				}).start();
			}
		});

		// 通过mImageView的post(Runnable)方法来执行异步操作,可以实现网络图片的异步加载
		findViewById(R.id.button3).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				new Thread(new Runnable() {

					@Override
					public void run() {
						// TODO Auto-generated method stub

						final Drawable drawable = getDrawableFromNet(IMAGE_URL);

						mImageView.post(new Runnable() {

							@Override
							public void run() {
								// TODO Auto-generated method stub
								mImageView.setImageDrawable(drawable);
							}
						});
					}
				}).start();
			}
		});

		// 通过AsyncTask类来实现异步操作,实现网络图片的加载
		findViewById(R.id.button4).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				new DownloadImageTask().execute(IMAGE_URL);
			}
		});

	}

	// 从指定的url下载网络图片
	private Drawable getDrawableFromNet(String imageUrl) {

		Drawable drawable = null;

		try {
			drawable = Drawable.createFromStream(
					new URL(imageUrl).openStream(), "image.gif");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Log.d("test", e.getMessage());
			e.printStackTrace();
		}

		if (drawable == null) {
			Log.d("test", "image is null");
		} else {
			Log.d("test", "image not null");
		}

		return drawable;

	}


代码(demo)下载地址:


编译环境eclipse,如果遇到如下错误:

error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'.

原因是無法找到原來的android-support-v7的支持包,需要重新添加。

http://www.hksilicon.com/kb/articles/603216/AndroidError-retrieving-parent-for-item-No-resource-found-that-matches-the-given-name-ThemeAppCompatLight


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值