安卓开发之利用runOnUiThread在子线程更新UI
package com.lidaochen.test; import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView; import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; public class MainActivity extends AppCompatActivity {
private EditText et_path;
private ImageView iv_pic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 找到 ImageView 和 EditText控件
et_path = (EditText)findViewById(R.id.et_path);
iv_pic = (ImageView)findViewById(R.id.iv_pic);
}
public void click(View v)
{
new Thread()
{
public void run()
{
try
{
// 获取图片路径
String path = et_path.getText().toString().trim();
File file = new File(getCacheDir(), Base64.encodeToString(path.getBytes(), Base64.DEFAULT));
if (file.exists() && file.length() > 0)
{
// 使用缓存图片
System.out.println("使用缓存图片!");
final Bitmap cacheBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
// 这个API不管你在什么位置上调用,action都运行在UI线程里
runOnUiThread(new Runnable() {
@Override
public void run() {
iv_pic.setImageBitmap(cacheBitmap);
}
});
}
else
{
// Toast.makeText(getApplicationContext(), "第一次连接网络!", Toast.LENGTH_SHORT).show();
System.out.println("第一次连接网络!");
// 创建url对象
URL url = new URL(path);
// 获取HttpURLConnection对象
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置请求方式
httpURLConnection.setRequestMethod("GET");
// 设置超时时间
httpURLConnection.setReadTimeout(5000);
// 获取服务器返回的状态码
int code = httpURLConnection.getResponseCode();
if (code == 200)
{
// 获取图片数据,不管什么数据,都是以流的形式返回
InputStream in = httpURLConnection.getInputStream();
// 缓存图片 谷歌给我们提供了一个缓存目录
FileOutputStream fos = new FileOutputStream(file);
int len = -1;
byte buffer[] = new byte[1024]; // 1kB
while((len = in.read(buffer)) != -1)
{
fos.write(buffer, 0, len);
}
// 关闭流
fos.close();
in.close();
// 通过位图工厂,获取位图
final Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
// 这个API不管你在什么位置上调用,action都运行在UI线程里
runOnUiThread(new Runnable() {
@Override
public void run() {
iv_pic.setImageBitmap(bitmap);
}
});
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}.start();
}
}
安卓开发之利用runOnUiThread在子线程更新UI的更多相关文章
- [Android学习笔记]子线程更新UI线程方法之Handler
关于此笔记 不讨论: 1.不讨论Handler实现细节 2.不讨论android线程派发细节 讨论: 子线程如何简单的使用Handler更新UI 问题: android开发时,如何在子线程更新UI? ...
- Android开发——实现子线程更新UI
Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...
- Android子线程更新UI的方法总结
版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...
- OkHttp3几个简单的例子和在子线程更新UI线程的方法
okHttp用于android的http请求.据说很厉害,我们来一起尝尝鲜.但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来. 首先需要了解一点,这里说的UI线程和主线程是一回事儿. ...
- 子线程更新UI界面的2种方法
一.一般我们都会在子线程完成一些耗时的操作. 1.Android中消息机制: 2.知识点: Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队, ...
- Android可以子线程更新UI?
初了解Android的时候,就知道Android是不能在子线程更新UI的,不然程序会直接抛出异常,告诉你,别给我在自线程搞事情! 但是,这个是针对普通的view做的限制,而TextureView,Su ...
- android子线程更新UI
参考:https://www.cnblogs.com/joy99/p/6121280.html 子线程是不能直接更新UI的.Android实现View更新有两组方法,分别是invalidate和pos ...
- Android通过子线程更新UI的几种方式
一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制: Handler消息机制 定义 Message 线程间通信的数据单元,可通过message携带需要的数据创建对象:M ...
- WPF Dispatcher.BeginInvoke子线程更新UI
在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象.“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者I ...
随机推荐
- java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】
一.概述 三款框架的功能对比 Mybatis-generator 通用Mapper Mybatis-Plus 代码生成器 支持自动生成Model,Mapper,Mapper XML文件 生成方式不够灵 ...
- Oracle中RAISE异常
转: Oracle中RAISE异常 由三种方式抛出异常 1. 通过PL/SQL运行时引擎 2. 使用RAISE语句 3. 调用RAISE_APPLICATION_ERROR存储过程 当数据库或PL/S ...
- 【问题解决】Flasgger mapping values are not allowed here?
参考来源:https://stackoverflow.com/questions/9055371/python-and-pyaml-yaml-scanner-scannererror-mapping- ...
- Qt编写控件属性设计器12-用户属性
一.前言 用户属性是后面新增加的一个功能,自定义控件如果采用的Q_PROPERTY修饰的属性,会自动识别到属性栏中,这个一般称为控件属性,在组态设计软件中,光有控件本身的控件属性还是不够的,毕竟这些属 ...
- Apache Flink 开发环境搭建和应用的配置、部署及运行
https://mp.weixin.qq.com/s/noD2Jv6m-somEMtjWTJh3w 本文是根据 Apache Flink 系列直播课程整理而成,由阿里巴巴高级开发工程师沙晟阳分享,主要 ...
- Django之密码加密
通过django自带的类库,来加密解密很方便,下面来简单介绍下: 导入包: from django.contrib.auth.hashers import make_password, check_p ...
- HDU1237 简单计算器 栈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...
- jenkins集成robot用例并发送自定义报告
slave
- git 获取线上代码并合并到本地
//查询当前远程的版本 $ git remote -v //获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch]) $ git fetch origin ...
- php cli传递参数的方法
php cli传递参数的方法 <pre>$options = "f:g:"; $opts = getopt( $options ); print_r($opts); & ...