学习目标:
1.volley框架学习
2.了解xml
学习内容:
1.创建一个新的项目,在activity_mian.xml中写入
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:orientation="vertical"
android:padding="20dp">
<EditText
android:id="@+id/edtImageUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/input_image_url"
android:textSize="20sp"
android:lines="2" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/btnDownload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doDownload"
android:textSize="20sp"
android:text="@string/download" />
<Button
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClear"
android:textSize="20sp"
android:text="@string/clear" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#bbbbbb" />
<ScrollView
android:id="@+id/svContent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ivImage"/>
</ScrollView>
</LinearLayout>
添加volley依赖
在清单文件中写入访问权限
2.在主方法中写入
package com.example.myapplication;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.Volley;
public class MainActivity extends AppCompatActivity {
private EditText edtImageUrl; // 网址编辑框
private ImageView ivImage; // 显示网络图片的图像控件
private RequestQueue mRequestQueue; // 请求队列
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 通过资源标识符获取控件实例
edtImageUrl = findViewById(R.id.edtImageUrl);
ivImage = findViewById(R.id.ivImage);
// 创建请求队列
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
/**
* 下载按钮单击事件处理方法
*
* @param view
*/
public void doDownload(View view) {
// 获取用户输入的网址
String strImageUrl = edtImageUrl.getText().toString();
// 网址非空校验
if (strImageUrl.length() == 0) {
Toast.makeText(getApplicationContext(), "请输入网址", Toast.LENGTH_SHORT).show();
edtImageUrl.requestFocus();
return;
}
// 创建图像请求对象
final ImageRequest imageRequest = new ImageRequest(
strImageUrl, // 参数1:目标服务器的URL地址
new Response.Listener<Bitmap>() { // 参数2:服务器响应成功的回调
@Override
public void onResponse(Bitmap response) {
ivImage.setImageBitmap(response);
}
},
0, // 参数3:指定允许图片最大的宽度(指定成0,不压缩图片)
0, // 参数4:指定允许图片最大的高度(指定成0,不压缩图片)
Bitmap.Config.RGB_565, // 参数5:指定图片颜色属性(RGB_565表示每个图片像素占据2个字节)
new Response.ErrorListener() { // 参数6:服务器响应失败的回调
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "服务器响应失败!", Toast.LENGTH_SHORT).show();
}
});
// 添加图像请求到请求队列
mRequestQueue.add(imageRequest);
}
/**
* 清空单击事件处理方法
*
* @param view
*/
public void doClear(View view) {
// 清空网址编辑框
edtImageUrl.setText("");
// 清空图像控件内容
ivImage.setImageBitmap(null);
// 让网址编辑框获取焦点
edtImageUrl.requestFocus();
}
}
找到一个图片网址,在手机中输入网址,并下载图片
我们也可以使用ImageLoader来下载网络图片
package com.example.myapplication;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.LruCache;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class MainActivity extends AppCompatActivity {
private EditText edtImageUrl; // 网址编辑框
private ImageView ivImage; // 显示网络图片的图像控件
private RequestQueue mRequestQueue; // 请求队列
private ImageLoader imageLoader; // 图像加载器
private ImageLoader.ImageListener imageListener; // 图像监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 通过资源标识符获取控件实例
edtImageUrl = findViewById(R.id.edtImageUrl);
ivImage = findViewById(R.id.ivImage);
// 创建请求队列
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
/**
* 下载按钮单击事件处理方法
*
* @param view
*/
public void doDownload(View view) {
// 获取用户输入的网址
String strImageUrl = edtImageUrl.getText().toString();
// 网址非空校验
if (strImageUrl.length() == 0) {
Toast.makeText(getApplicationContext(), "请输入网址", Toast.LENGTH_SHORT).show();
edtImageUrl.requestFocus();
return;
}
// 创建图像加载器对象
imageLoader = new ImageLoader(mRequestQueue, new BitmapCache());
// 获取图像监听器对象
imageListener = imageLoader.getImageListener(
ivImage, // 参数1:指定用于显示图片的ImageView控件
R.drawable.ic_launcher_background, // 参数2:指定图片加载过程中显示的图片
android.R.drawable.ic_delete // 参数3:指定图片加载失败时显示的图片
);
// 加载网络图片
imageLoader.get(strImageUrl, imageListener);
}
/**
* 清空单击事件处理方法
*
* @param view
*/
public void doClear(View view) {
// 清空网址编辑框
edtImageUrl.setText("");
// 清空图像控件内容
ivImage.setImageBitmap(null);
// 让网址编辑框获取焦点
edtImageUrl.requestFocus();
}
/**
* 绘图缓存类
*/
class BitmapCache implements ImageLoader.ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
}
后面都是一样的操作就不说了,我们开始了解xml吧
1.xml简介
XML数据全名叫做可拓展标记语言,类似于HTML。在很多时候我们将xml用来储存数据,可以将其看作一个微型的数据库,比如我们Android中的SharedPreference就是使用XML文件来保存配置信息的,而我们的SQLite的底层也是一个xml文件;而在网络应用方面通常作为信息的载体,我们通常把数据包装成xml来传递
2.xml的三种方式
2.1 sax解析
对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素(element)开始与结束,文档(document)结束等地方时,通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。解析速度快,占用内存也较少,每需要解析一类xml就需要编写新的适合该类XML的处理类。
2.2DOM解析
先把 XML文档都读到内存中,然后再有DOM
API来访问树形结构并获取数据。这个写起来很简单,但是很消耗内存,加入读取的数据量大,手机内存不够的话可能导致手机死机,不建议在安卓设备中使用解析,简单的XML文件到可以。
常用的五个接口与类:Document,Element,Node,NodeList,DOMParser
DOM是整个文件解析到内存中,供用户需要的节点信息,支持随机访问。
2.3pull解析
XML
pull提供了开始元素和结束元素。当某个元素开始时,我们调用parser.nextText0从XML文档中提取所有字符数据,当解释到一个文档结束时,自动生成EndDocument。常用接口和类:XmlPullParser,XmlSreializer,XmlPullParserFactory
和sax差不多,代码没那么实现较为简单,非常适合移动设备,安卓系统内置pull解析器,而且安卓系统内部默认使用pull来解析XML文件。如果需要在Jay2EE或者其他使用pull需要导入两个包,后面给出下载。
今天的了解到此为止,明天去了解,json数据分析。