首页 > 其他分享 >Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

时间:2022-11-11 11:37:33浏览次数:48  
标签:异步 java 第四十九 Bitmap connection import Android bitmap android


加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行;2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载。

一、AsyncTask方式

1.main.xml:

<RelativeLayout 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" >

<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />

</RelativeLayout>


2.MainActivity.java:

package com.example.imageloaderdemo;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
private ImageView mImageView;
private static String URLSTRING;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.img);
URLSTRING="http://photocdn.sohu.com/20110927/Img320705637.jpg";//图片地址
MyAsyncTask myAsyncTask=new MyAsyncTask();
myAsyncTask.execute(URLSTRING);

}

class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {


@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
mImageView.setImageBitmap(result);
}

@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap=null;
try {
URL url=new URL(params[0]);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
if(connection.getResponseCode()==200){
InputStream inputStream=connection.getInputStream();
bitmap=BitmapFactory.decodeStream(inputStream);
}

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return bitmap;
}

}

}


3.总结:

AsyncTask<String, Void, Bitmap>//三个参数,第一个为传入的URL,第二个表示中间状态的,这里传入空即可,第三个为返回值

doInBackground(String... params)方法新开了一个线程,AysncTask其他几个方法都在主线程中运行

mImageView.setImageBitmap(result);可以直接设置

运行实例如下:


Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)_图片


成功的加载了网络图片。

二、Handler方式

异步请求Bitmap,因为子线程无法更新主线程UI,所以必须通过Handler的方式进行图片渲染。

布局文件不变,下面我们看一下MainActivity.java:

package com.example.imageloaderdemo;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

public class MainActivity extends Activity {
private ImageView mImageView;
private static String URLSTRING;

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
Bitmap bitmap = (Bitmap) msg.obj;
mImageView.setImageBitmap(bitmap);
};
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.img);
URLSTRING = "http://photocdn.sohu.com/20110927/Img320705637.jpg";// 图片地址

MyThread myThread = new MyThread();
myThread.start();// 调用线程

}

class MyThread extends Thread {
@Override
public void run() {
super.run();
Bitmap bitmap = null;
try {
URL url = new URL(URLSTRING);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
if (connection.getResponseCode() == 200) {
InputStream inputStream = connection.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream);
Message message = new Message();
message.obj = bitmap;
handler.sendMessage(message);

}

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}

}


总结:

class MyThread extends Thread{}

2.通过sendMessage发送对象,通过handleMessage处理数据。

很简单啊,希望可以帮到初学者。

喜欢的朋友关注我!谢谢

标签:异步,java,第四十九,Bitmap,connection,import,Android,bitmap,android
From: https://blog.51cto.com/u_15866446/5843748

相关文章

  • Android--全局获取Context的技巧
    Android中很多地方都会用到Context,弹出Toast的时候需要、启动活动时需要、发送广播的时候也需要、操作数据库的时候需要、使用通知的时候也需要等等等。或许你现在还没有为......
  • Android实战--汉字转全拼
    上一节介绍了天气预报小DEMO的制作,有些人就觉得打拼音不符合用户的习惯,怎么改成打汉字并且可以实现功能呢?这里就要用到汉字转全拼,这时我们就要引入jar包:将jar包解压后导入我......
  • flutter 原生iOS/Android处理图片压缩并返回
    flutter处理图片压缩效率不高,使用了flutter_luban这个框架压缩,仍然不能达到比较理想的效果,想到原生的压缩效率很高,于是想到了使用iOS/Android原生来处理压缩,然后通过消息返......
  • Java组合异步编程(2)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 多数码农在开发的时候,要么处理同步应用,要么处理异步。但是如果能学会使用CompletableFuture,就会具备一种神奇的能力:将同......
  • 问题:父组件mounted发送异步请求,子组件props接收?
    极有可能是因为,父组件mounted异步的请求,在子组件中被v-for控制,所以导致了,父组件mounted会先执行 父组件mounted中发送一个异步请求,然后发送给子组件子组件通过props接收......
  • Android中Java和JavaScript交互
    Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。如何实现......
  • Android Study Material Design 二 之:这可能是RecyclerView最全解析 高级拓展 实现复
    LZ-Says:最近天凉了,丝丝凉意变成了浓浓冻得哆嗦了。穿个衣服都感觉很是痛苦了。点背的家里突然发现漏水,住了小一年了,才发现,怪不得物业大爷说你们几个真能用水,涨钱。。。然......
  • AndroidManifest.xml文件--权限设置
    在AndroidManifest.xml中设置访问网络<uses-permissionandroid:name="android.permission.INTERNET"/>存储SD卡<uses-permissionandroid:name="android.permi......
  • Android Study 之通过DialogFragment玩转高仿IOS弹框~ ^.^
    LZ-Say:在努力向前奔跑的途中,不要忘记让自己始终保持一个良好的状态,一颗初心,一颗永不言弃的心,一起加油`前言LZ虽说是搞Android的,但是对IOS的风格样式甚是酷爱,感觉简约大方,而......
  • 工具篇 之 Android WIFI ADB 实战
    LZ-Says:累哇哇。。。前言enmmm,新工作,新起点,新开始。。。今天忘记拿usb线,想着怎么破?enmmm,想了想,突然想到有个WIFIADB,遂,开始一波实战~~~实践直接插件里搜索,AndroidWIFI......