使用子线程获取网络图片
1.采用httpUrlConnection直连方式获取图片
2.采用子线程方式获取

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <ImageView android:id="@+id/iv_icon"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText android:id="@+id/et_url"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" /> <Button android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="Go" /> </LinearLayout>
</LinearLayout>

线性布局

 public class MainActivity extends Activity implements OnClickListener {
private final int SUCESS = 0;
private final int ERROR=-1;
private EditText etUrl;
private ImageView ivIcon; private Handler hand=new Handler(){
/*
* 接收信息
* */
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what==SUCESS){//识别访问handle的程序集
ivIcon.setImageBitmap((Bitmap)msg.obj);//设置bitmap显示图片
}else if(msg.what==ERROR){
Toast.makeText(MainActivity.this, "抓取异常", 0).show();
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ivIcon = (ImageView)findViewById(R.id.iv_icon);
etUrl = (EditText)findViewById(R.id.et_url); findViewById(R.id.btn_submit).setOnClickListener(this);
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
final String url=etUrl.getText().toString();
//Bitmap bitmap=getImageFormat(url);
//ivIcon.setImageBitmap(bitmap);//设置image显示图片
new Thread(new Runnable(){
@Override
public void run(){
Bitmap bitmap=getImageFormat(url);
if(bitmap!=null){
Message msg=new Message();
msg.what=SUCESS;//设置handle区别码
msg.obj=bitmap;//将二进制数据放入msg
hand.sendMessage(msg);
}else{
Message msg=new Message();
msg.what=ERROR;
hand.sendMessage(msg);
}
}
}).start(); } /**
* 根据url链接网络获取图片返回
* */
private Bitmap getImageFormat(String url){
HttpURLConnection conn=null;
try {
URL mUrl=new URL(url);
conn =(HttpURLConnection)mUrl.openConnection();
//设置传值方式
conn.setRequestMethod("GET");
//设置链接超时时间
conn.setConnectTimeout(10000);
//设置等待时间
conn.setReadTimeout(5000); conn.connect();
int code=conn.getResponseCode();//获得服务器响应对象
if(code==200){
//访问成功
InputStream is=conn.getInputStream();//获得服务器返回的二进制数据
Bitmap bitmap = BitmapFactory.decodeStream(is);//将二进制流转换为bitmap图片 return bitmap;
}else{
Log.i("MainActivity","链接不正常了...");
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(conn!=null){
conn.disconnect();
}
} return null;
} }

权限:<uses-permission android:name="android.permission.INTERNET"/>

在不使用子线程的方式下:等待超时后程序异常
addroid not responding(应用程序无响应)因子程序等待阻塞了主线程 ANR异常
异常:
CalledFrowWrongThreadException:Only the original thread that creaded a view hierarchy can touch its views
只有原始的线程(主线程或ui线程)才能修改view对象

handler处理过程

 public class MainActivity extends Activity {

     private EditText etUserName;
private EditText etPassword; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); etUserName = (EditText) findViewById(R.id.et_username);
etPassword = (EditText) findViewById(R.id.et_password);
} public void doGet(View v) {
final String userName = etUserName.getText().toString();
final String password = etPassword.getText().toString(); new Thread(
new Runnable() { @Override
public void run() {
// 使用get方式抓去数据
final String state = NetUtils.loginOfGet(userName, password); // 执行任务在主线程中
runOnUiThread(new Runnable() {
@Override
public void run() {
// 就是在主线程中操作
Toast.makeText(MainActivity.this, state, 0).show();
}
});
}
}).start();
} public void doPost(View v) {
final String userName = etUserName.getText().toString();
final String password = etPassword.getText().toString(); new Thread(new Runnable() {
@Override
public void run() {
final String state = NetUtils.loginOfPost(userName, password);
// 执行任务在主线程中
runOnUiThread(new Runnable() {
@Override
public void run() {
// 就是在主线程中操作
Toast.makeText(MainActivity.this, state, 0).show();
}
});
}
}).start();
}
}
 public class NetUtils {

     private static final String TAG = "NetUtils";

     /**
* 使用post的方式登录
* @param userName
* @param password
* @return
*/
public static String loginOfPost(String userName, String password) {
HttpURLConnection conn = null;
try {
URL url = new URL("http://10.0.2.2:8080/ServerItheima28/servlet/LoginServlet"); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST");
conn.setConnectTimeout(10000); // 连接的超时时间
conn.setReadTimeout(5000); // 读数据的超时时间
conn.setDoOutput(true); // 必须设置此方法, 允许输出
// conn.setRequestProperty("Content-Length", 234); // 设置请求头消息, 可以设置多个 // post请求的参数
String data = "username=" + userName + "&password=" + password; // 获得一个输出流, 用于向服务器写数据, 默认情况下, 系统不允许向服务器输出内容
OutputStream out = conn.getOutputStream();
out.write(data.getBytes());
out.flush();
out.close(); int responseCode = conn.getResponseCode();
if(responseCode == 200) {
InputStream is = conn.getInputStream();
String state = getStringFromInputStream(is);
return state;
} else {
Log.i(TAG, "访问失败: " + responseCode);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn != null) {
conn.disconnect();
}
}
return null;
} /**
* 使用get的方式登录
* @param userName
* @param password
* @return 登录的状态
*/
public static String loginOfGet(String userName, String password) {
HttpURLConnection conn = null;
try {
String data = "username=" + URLEncoder.encode(userName) + "&password=" + URLEncoder.encode(password);
URL url = new URL("http://10.0.2.2:8080/ServerItheima28/servlet/LoginServlet?" + data);
conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // get或者post必须得全大写
conn.setConnectTimeout(10000); // 连接的超时时间
conn.setReadTimeout(5000); // 读数据的超时时间 int responseCode = conn.getResponseCode();
if(responseCode == 200) {
InputStream is = conn.getInputStream();
String state = getStringFromInputStream(is);
return state;
} else {
Log.i(TAG, "访问失败: " + responseCode);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn != null) {
conn.disconnect(); // 关闭连接
}
}
return null;
} /**
* 根据流返回一个字符串信息
* @param is
* @return
* @throws IOException
*/
private static String getStringFromInputStream(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1; while((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
is.close(); String html = baos.toString(); // 把流中的数据转换成字符串, 采用的编码是: utf-8 // String html = new String(baos.toByteArray(), "GBK"); baos.close();
return html;
}
}

基础学习总结(七)--子线程及Handler的更多相关文章

  1. (原)Android在子线程用handler发送的消息,主线程是怎么loop到的?

    来自知乎:https://www.zhihu.com/question/48130951?sort=created   大家都知道Android的Looper是ThreadLocal方式实现,每个线程 ...

  2. android 网络技术基础学习 (七)

    使用httpclient协议访问网络: public class MainActivity extends Activity implements OnClickListener{ public vo ...

  3. Android子线程创建Handler方法

    如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如: new Thread(new Runnable() { public void run() { Handler hand ...

  4. Java基础学习笔记七 Java基础语法之继承和抽象类

    继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...

  5. salesforce零基础学习(七十六)顺序栈的实现以及应用

    数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...

  6. javascript基础学习(七)

    javascript之Object对象 学习要点: 创建Object对象 Object对象属性 Object对象方法 一.创建Object对象 new Object(); new Object(val ...

  7. salesforce 零基础学习(七十)使用jquery table实现树形结构模式

    项目中UI需要用到树形结构显示内容,后来尽管不需要做了,不过还是自己做着玩玩,mark一下,免得以后项目中用到. 实现树形结构在此使用的是jquery的dynatree.js.关于dynatree的使 ...

  8. salesforce零基础学习(七十三)ProcessInstanceWorkItem/ProcessInstanceStep/ProcessInstanceHistory浅谈

    对于审批流中,通过apex代码进行审批操作一般都需要获取当前记录对应的ProcessInstanceWorkitem或者ProcessInstanceStep然后执行Approval.process操 ...

  9. salesforce零基础学习(七十八)线性表链形结构简单实现

    前两篇内容为栈和队列的顺序结构的实现,栈和队列都是特殊的线性表,线性表除了有顺序结构以外,还有线性结构. 一.线性表的链形结构--链表 使用顺序存储结构好处为实现方式使用数组方式,顺序是固定的.所以查 ...

随机推荐

  1. Hastiness

    Problem Description How many problems did you AC?When you read this problem, don’t hasty and careles ...

  2. Linux分区有损坏修复

    如果Linux分区有损坏情况,启动有问题,不能正常进入文本或图形界面.那么一般会出现提示,需要输入Root密码登录后采用fsck -t ext3 -r /usr/local 修复 , /usr/loc ...

  3. javaEE学习笔记-单例模式

    定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的三要素: (1)私有的静态的成员变量 (2)私有的构造方法 (3)公共的静态的入口点方法 单例模式的分类: (1)饿 ...

  4. Android 拍照 代码实例

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 这是我做的一个简单的利用Android手机的摄像头进行拍照的实例. 在这里我实现了基本的拍照.照片的存储 ...

  5. Shell学习笔记 - 正则表达式

    一.正则表达式是什么? 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作. 二.正则表达式与通配符 1. 正则表达式 用来在文件中匹配符合条件的字 ...

  6. 转: Android基于HLS和RTMP协议的第三方SDK选择

    转自: http://isunxu.xyz/android/between-rtmp-and-hls-third-party-choice/ 协议的详解网上资料都太多了,我就不赘述了.Android上 ...

  7. 初识 Asp.Net内置对象之Application对象

    Application对象 Applocation对象用于共享应用程序级信息,即多个用户可以共享一个Applocation对象. 用户在请求Asp.Net文件时,将启动应用程序并且创建Applicat ...

  8. 实现多个UIView之间切换的动画效果

    @interface RootViewController (){ UIView *view1; UIView *view2; int flag; } @end @implementation Roo ...

  9. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...

  10. Java作业 输入圆的半径计算输出圆的周长和面积

    package text1; import java.util.Scanner; public class text11 { public static void main(String[] args ...