运用Handler.post()方法进行数据更新跟用Message对比(18)
运用Handler.post()方法进行数据更新跟用Message对比(18)
flyqilong 发表于2年前
运用Handler.post()方法进行数据更新跟用Message对比(18)
  • 发表于 2年前
  • 阅读 12
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 这是第一种方法:利用handler.sendEmptyMessage()通知更新 另外一种方法是不用到Message(),只是利用handler.post(Runable)方法来更新,里面其实放的是代码,注意:Handler.post(括号里是代码)里面存放的代码它属于主线程,这是特别要注意的;
//运用Handler.post()
public class SecondActivity extends Activity {
	private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
	private ImageView imageview;
	private Handler handler = new Handler();// 注意:这里用handler.post()方法,所以不用实现里面的方法

	// 这种方法是不用到Message(),只是利用handler.post(Runable)方法来更新,里面其实放的是代码,注意:存放的代码它属于主线程;
	// 注意:这里用handler.post()方法,所以不用实现里面的方法

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 这个SecondActivity要用主布局记得在功能清单文件改配置
		imageview = (ImageView) this.findViewById(R.id.imageview);
		// 子线程,下载操作
		new Thread(new Runnable() {

			@Override
			public void run() {
				Log.i("MainActivity", "first"
						+ Thread.currentThread().getName());
				byte[] data = loadImage(url);
				final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
						data.length);
				handler.post(new Runnable() {
					// 注意:这里是主线程,只是一个代码,因为它没有启动所以不算线程
					@Override
					public void run() {
						Log.i("MainActivity", "second"
								+ Thread.currentThread().getName());
						imageview.setImageBitmap(bitmap);
					}
				});

			}
		}).start();
	}

	public byte[] loadImage(String url) {
		try {
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(url);
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toByteArray(response.getEntity());
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

//使用handler.sendEmptyMessage()通知更新
//这是第一种方法:利用handler.sendEmptyMessage()通知更新
//另外一种方法是不用到Message(),只是利用handler.post(Runable)方法来更新,里面其实放的是代码,注意:存放的代码它属于主线程;

public class MainActivity extends Activity {
	private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
	private ImageView imageview;
	private ProgressDialog dialog;
	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 0:
				dialog.show();
				break;

			case 1:
				imageview.setImageBitmap((Bitmap) msg.obj);
				break;
			case 2:
				dialog.dismiss();
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageview = (ImageView) this.findViewById(R.id.imageview);
		dialog = new ProgressDialog(this);
		dialog.setTitle("提示");
		dialog.setIcon(R.drawable.ic_launcher);
		dialog.setMessage("正在下载数据!!!");
		new Thread(new Runnable() {

			@Override
			public void run() {
				// 1.显示对话框
				handler.sendEmptyMessage(0);// 通知主线程显示对话框
				// 2.下载数据
				byte[] data = loadImage(url);
				Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
						data.length);
				Message message = Message.obtain();
				message.what = 1;
				message.obj = bitmap;
				handler.sendMessage(message);// 发送主线程设置图片显示
				// 3.关闭对话框
				handler.sendEmptyMessage(2);
			}

		}).start();
	}

	public byte[] loadImage(String url) {
		try {
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(url);
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toByteArray(response.getEntity());
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 93
码字总数 53900
×
flyqilong
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: