动态显示带图片列表【Android】

2023-11-16

一.功能描述:
        1. 动态获取服务器端商品信息显示
        2. 动态加载服务器端图片显示
二.技术点:
  1. ListView+BaseAdapter
  2. JSON数据解析
  3. Handler+Thread
  4. HttpUrlConnection
  5. AsyncTask
  6. HttpClient
  7. 图片的三级缓存

三.过程分析 :

1. 搭建服务器端
2. 界面布局
整体 : ListView+提示视图
Item : LinearLayout
3. 动态显示列表
使用Handler+Thread处理联网请求, 得到json数据, 解析成List<ShopInfo>
使用BaseAdapter显示文本列表
根据url, 异步请求显示图片(使用三级缓存)


4. 动态显示列表中的图片
--->Bitmap--->手机本地的图片文件--->服务器端的图片文件
1). 图片的三级缓存
一级缓存: 内存缓存, 缓存的是bitmap对象, 用Map<String, Bitmap>结构保存, key是url
二级缓存: 本地(sd卡)缓存, 缓存的是图片文件,  /storage/sdcard/Android/data/packageName/files/图片文件名(xxx.jpg) 
三级缓存: 远程服务器缓存, 缓存的是图片文件, 远程服务器上的应用中
2). 如何使用三级缓存?  -----如何根据图片的url动态显示图片?    
String iamgePath = http://192.168.10.165:8080//L05_Web/images/f10.jpg和ImageView对象
1). 根据url从一级缓存中取对应的bitmap对象
如果有, 显示(结束)
如果没有, 进入2)
2). 从二级缓存中查找: 得到文件名并在sd卡的缓存目录下加载对应的图片得到Bitmap对象
如果有: 显示, 缓存到一级缓存中(结束)
如果没有, 进入3)
3). 显示代表提示正在加载的图片, 启动分线程联网请求得到Bitmap对象
如果没有: 显示提示错误的图片(结束)
如果有: 
显示
缓存到一级缓存
缓存到二级缓存
3). 在ListView使用图片三级缓存会存在图片闪动的bug
1). 原因
converView被复用了
2). 解决
a. 每次getView()都将图片的url保存到ImageView上: imageView.setTag(imagePath)
b. 在分线程准备请求服务器加载图片之前, 比较准备加载图片的url与ImageView中保存的最新图片的url是同一个, 
如果不是同一个, 当前加载图片的任务不应该再执行
如果相同, 继续执行加载远程图片
c. 在主线程准备显示图片之前, 比较加载到图片的url与ImageView中保存的最新图片的url是同一个
如果不是同一个, 不需要显示此图片
如果相同, 显示图片
四.代码实现:

1.MainActivity.java

package com.example.apphandler;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class MainActivity extends Activity {

	protected static final int WHAT_REQUEST_SUCCESS = 1;
	protected static final int WHAT_REQUEST_ERROR = 2;
	private ListView lv_main;
	private LinearLayout ll_main_loading;
	private List<ShopInfo> data = new ArrayList<ShopInfo>();
	private ShopInfoAdapter adapter;
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case WHAT_REQUEST_SUCCESS:
				ll_main_loading.setVisibility(View.GONE);
				//显示列表
				lv_main.setAdapter(adapter);
				break;
			case WHAT_REQUEST_ERROR:
				ll_main_loading.setVisibility(View.GONE);
				Toast.makeText(MainActivity.this, "加载数据失败", 1).show();
				break;

			default:
				break;
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		lv_main = (ListView) findViewById(R.id.lv_main);
		ll_main_loading = (LinearLayout) findViewById(R.id.ll_main_loading);
		adapter = new ShopInfoAdapter();
		
		//1. 主线程, 显示提示视图
		ll_main_loading.setVisibility(View.VISIBLE);
		//2. 分线程, 联网请求
		//启动分线程请求服务器动态加载数据并显示
		new Thread(){
			public void run() {
				//联网请求得到jsonString
				try {
					String jsonString = requestJson();
					Log.i("TAG",jsonString);
					//解析成List<ShopInfo>
					data = new Gson().fromJson(jsonString, new TypeToken<List<ShopInfo>>(){}.getType());
					Log.i("TAG", data+"");
					//3. 主线程, 更新界面
					handler.sendEmptyMessage(WHAT_REQUEST_SUCCESS);//发请求成功的消息
				} catch (Exception e) {
					e.printStackTrace();
					handler.sendEmptyMessage(WHAT_REQUEST_ERROR);//发送请求失败的消息
				}
			}
		}.start();
		
		
	}
	
	/**
	 * 联网请求得到jsonString
	 * @return
	 * @throws Exception 
	 */
	private String requestJson() throws Exception {
		String result = null;
		String path = "http://192.168.51.65:8080/L05_Web/ShopInfoListServlet";
		//1. 得到连接对象
		URL url = new URL(path);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		//2. 设置
		connection.setConnectTimeout(5000);
		connection.setReadTimeout(5000);
		//连接
		connection.connect();
		//发请求并读取服务器返回的数据
		int responseCode = connection.getResponseCode();
		if(responseCode==200) {
			InputStream is = connection.getInputStream();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int len = -1;
			while ((len = is.read(buffer)) != -1) {
				baos.write(buffer, 0, len);
			}
			baos.close();
			is.close();
			
			result = baos.toString();
		} else {
			//也可以抛出运行时异常
		}
		connection.disconnect();
		return result;
	}

	class ShopInfoAdapter extends BaseAdapter {

		private ImageLoader imageLoader;
		
		public ShopInfoAdapter() {
			imageLoader = new ImageLoader(MainActivity.this, R.drawable.loading, R.drawable.error);
		}
		@Override
		public int getCount() {
			return data.size();
		}

		@Override
		public Object getItem(int position) {
			return data.get(position);
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView==null) {
				convertView = View.inflate(MainActivity.this, R.layout.item_mian, null);
			}
			//得到当前行的数据对象
			ShopInfo shopInfo = data.get(position);
			//得到当前行的子View
			TextView nameTV = (TextView) convertView.findViewById(R.id.tv_item_name);
			TextView priceTV = (TextView) convertView.findViewById(R.id.tv_item_price);
			ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_item_icon);
			//设置数据
			nameTV.setText(shopInfo.getName());
			priceTV.setText(shopInfo.getPrice()+"元");
			String imagePath = shopInfo.getImagePath();
			//根据图片路径启动分线程动态请求服务加载图片并显示
			imageLoader.loadImage(imagePath, imageView);
			return convertView;
		}
		
	}
}
2.ImageLoader.java

package com.example.apphandler;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

/**
 * 用于加载图片并显示的类
 * 
 * @author Xiaocici String iamgePath =
 *         http://192.168.10.165:8080//L05_Web/images/f10.jpg和ImageView对象 1).
 *         根据url从一级缓存中取对应的bitmap对象 如果有, 显示(结束) 如果没有, 进入2) 
 *         2). 从二级缓存中查找:
 *         得到文件名并在sd卡的缓存目录下加载对应的图片得到Bitmap对象 如果有: 显示, 缓存到一级缓存中(结束) 如果没有, 进入3)
 *         3). 显示代表提示正在加载的图片, 启动分线程联网请求得到Bitmap对象 如果没有: 显示提示错误的图片(结束) 如果有: 显示
 *         缓存到一级缓存 缓存到二级缓存
 */
public class ImageLoader {
	private Context context;
	private int loadingImageRes;
	private int errorImageRes;

	public ImageLoader(Context context, int loadingImageRes, int errorImageRes
			) {
		super();
		this.context = context;
		this.loadingImageRes = loadingImageRes;
		this.errorImageRes = errorImageRes;
	}

	// 用于缓存bitmap的容器对象
	private Map<String, Bitmap> cacheMap = new HashMap<String, Bitmap>();

	/**
	 * 加载图片并显示
	 * 
	 * @param imagePath
	 * @param imageView
	 */
	public void loadImage(String imagePath, ImageView imageView) {
		//将需要显示的图片保存在视图上
		imageView.setTag(imagePath);
		/**
		 * 1). 根据url从一级缓存中取对应的bitmap对象 如果有, 显示(结束) 如果没有, 进入2)
		 */
		Bitmap bitmap = getFormFirstCache(imagePath);
		if (bitmap != null) {
			imageView.setImageBitmap(bitmap);
			return;
		}
		/*
		 * 2). 从二级缓存中查找: 得到文件名并在sd卡的缓存目录下加载对应的图片得到Bitmap对象 如果有: 显示, 缓存到一级缓存中(结束)
		 * /storage/sdcard/Android/data/packageName/files/图片文件名(xxx.jpg) 如果没有,
		 * 进入3)
		 */
		bitmap = getFromSecondCache(imagePath);
		if (bitmap != null) {
			imageView.setImageBitmap(bitmap);
			cacheMap.put(imagePath, bitmap);
			return;
		}
		/*
		 * 3). 显示代表提示正在加载的图片, 启动分线程联网请求得到Bitmap对象 如果没有: 显示提示错误的图片(结束) 如果有:
		 * 缓存到一级缓存(分线程) 缓存到二级缓存 (分线程) 显示(主线程)
		 */
		loadBitmapFromThirdCache(imagePath, imageView);
	}

	/**
	 * 根据图片url从三级缓存中取对应的bitmap对象并显示
	 * 
	 * @param imagePath
	 * @param imageView
	 *            AsyncTask
	 */
	private void loadBitmapFromThirdCache(final String imagePath, final ImageView imageView) {
		new AsyncTask<Void, Void, Bitmap>(){
			protected void onPreExecute() {
				imageView.setImageResource(loadingImageRes);
			};
			//联网请求得到bitmap对象
			@Override
			protected Bitmap doInBackground(Void... params) {
				Bitmap bitmap = null;
				try {
					//在准备请求服务器图片之前, 判断是否需要加载
					String newImagePath = (String) imageView.getTag();
					if(newImagePath!=imagePath) {//视图已经被复用了
						return null;
					}
					//得到连接
					URL url = new URL(imagePath);
					HttpURLConnection connection = (HttpURLConnection) url.openConnection();
					//设置
					connection.setConnectTimeout(5000);
					connection.setReadTimeout(5000);
					//连接
					connection.connect();
					//发请求读取返回的数据并封装为bitmap
					int responseCode = connection.getResponseCode();
					if(responseCode==200){
						InputStream is = connection.getInputStream();//图片文件流
						//将is封装为bitmap
						bitmap = BitmapFactory.decodeStream(is);
						is.close();
						if(bitmap != null){
							//缓存到一级缓存(分线程)
							cacheMap.put(imagePath, bitmap);
							//缓存到二级缓存 (分线程)
							
							String filesPath = context.getExternalFilesDir(null).getAbsolutePath();
							String fileName = imagePath.substring(imagePath.lastIndexOf("/") + 1);
							String filePath = filesPath + "/" + fileName;
							
							bitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream(filePath));
						}
					}
					connection.disconnect();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return bitmap;
			}
			
			protected void onPostExecute(Bitmap bitmap) {
				//在主线程准备显示图片之前, 需要判断是否需要显示
				String newImagePath = (String) imageView.getTag();
				if(newImagePath!=imagePath) {//视图已经被复用了
					return;
				}
				
				//如果没有: 显示提示错误的图片(结束)
				if(bitmap == null){
					imageView.setImageResource(errorImageRes);
				} else {
					imageView.setImageBitmap(bitmap);
				}
			};
		}.execute();
	}

	/**
	 * 根据图片url从二级缓存中取对应的bitmap对象
	 * 
	 * @param imagePath
	 * @return
	 */
	private Bitmap getFromSecondCache(String imagePath) {
		Log.i("TAG", imagePath+"");
		// /storage/sdcard/Android/data/packageName/files/图片文件名(xxx.jpg)
		String filesPath = context.getExternalFilesDir(null).getAbsolutePath();
		Log.i("TAG", imagePath+"");
		String fileName = imagePath.substring(imagePath.lastIndexOf("/") + 1);
		Log.i("TAG", "后");
		String filePath = filesPath + "/" + fileName;
		return BitmapFactory.decodeFile(filePath);
	}

	/**
	 * 根据图片url从一级缓存中取对应的bitmap对象
	 * 
	 * @param imagePath
	 * @return
	 */
	private Bitmap getFormFirstCache(String imagePath) {
		// TODO Auto-generated method stub
		return cacheMap.get(imagePath);
	}

}

3.ShopInfo.java

package com.example.apphandler;

public class ShopInfo {
	private int id;
	private String name;
	private double price;
	private String imagePath;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getImagePath() {
		return imagePath;
	}
	public void setImagePath(String imagePath) {
		this.imagePath = imagePath;
	}
	public ShopInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	public ShopInfo(int id, String name, double price, String imagePath) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
		this.imagePath = imagePath;
	}
	@Override
	public String toString() {
		return "ShopInfo [id=" + id + ", name=" + name + ", price=" + price
				+ ", imagePath=" + imagePath + "]";
	}
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态显示带图片列表【Android】 的相关文章

  • 使用 JSONArray 还是普通数组来存储/读取数据更有效?

    我正在使用一个连接到PHP MySQL返回所有内容的服务器JSON格式 例如 用户列表作为JSONArray of JSONObject 每个对象都包含单个用户的信息 姓名 位置 电话号码等 处理这种格式的信息时 将所有内容保留在其中会更有
  • 如何在 Android 中更改 Drawable 的颜色?

    我正在开发一个 Android 应用程序 并且我有一个从源图像加载的可绘制对象 在此图像上 我想将所有白色像素转换为不同的颜色 例如蓝色 然后缓存生成的 Drawable 对象 以便稍后使用它 举例来说 假设我有一个 20x20 PNG 文
  • 如何替换 Android 中已弃用的 Bundle/Argument get(key) 调用

    我有以下扩展函数 允许我在应用程序活动和片段之间传递捆绑数据项 inline fun
  • 如何从Firebase Firestore实时更新文档中获取修改后的字段或数据? [复制]

    这个问题在这里已经有答案了 我有多个文档 我的问题是我无法获取修改的特定数据 我正在获取完整的文档 db collection employees whereEqualTo OID OID addSnapshotListener new E
  • 在 ChromeO 上安装未知来源的 apk

    我今天早上更新了我的 Chromebook Asus Flip 以获取 Play 商店 我的 Chromebook 安装了 M53dev 通道版本 它运作良好 我可以安装并运行从 Play 商店下载的 Android 应用程序 我想测试我的
  • 使用 Fragment 在工具栏中实现 SearchView

    当前情况 我的应用程序主页由导航抽屉组成 因此我将视图作为片段加载 我的工具栏中也有搜索图标 我在中实现了它menu xml 下一步我实施了SearchView通过以下问题的答案来获取搜索图标在工具栏中实现搜索 https stackove
  • 在 gradle 中,我应该排除分支下的所有依赖项还是只排除根就足够了?

    我已将以下自定义任务添加到我的build gradlefile 为了打印出依赖项的依赖项 This part is useful for finding conflict resolution s between dependencies
  • 改造中的多个队列导致内存不足错误?

    我正在使用retrofit2 做我的项目 当我的呼叫失败时 我再次重复相同的呼叫 重复此 呼叫使我的应用程序强制关闭 当我查看日志时 我得到了错误日志 如下所示 我觉得这是由于同一呼叫的多次排队造成的 所以我在排队之前就这样做了 我打电话给
  • 退出设备上的 system.img

    我正在为我们部署给客户的设备 LG p509 Optimus 1 开发自动应用程序更新解决方案 我们可以控制这些设备 并且目前在它们上安装自定义内核 但不是完整的自定义 ROM 由于我们试图在设备上自动更新我们的应用程序 因此我们需要由我们
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • 需要 Android webview window.open() 和 window.close() 的信息

    我正在开发一个安卓应用程序 这是我网站的 WebView 该网站包含一个弹出按钮 单击该按钮后 将打开一个新窗口并显示内容 该链接可以来自外部站点 然而 当我实现此操作时 新选项卡正在打开 之后它会弹出以打开浏览器 尽管在 Web 视图中打
  • Android上如何获取ImageView的Drawable的矩形?

    我想要获取将包裹 ImageView 的 Drawable 的矩形对象 而不是包裹 ImageView 的矩形 我将使用该矩形在 Drawable 周围绘制一些奇特的矩形 我怎样才能得到那个矩形 Rect rect new Rect Ima
  • 控制 OverlayItem 大小

    我正在构建一个在单个 ItemizedOverlay 中包含几十个 OverlayItems 的地图 我的地图设计为可以非常近距离地查看 大约缩放级别 18 并且 OverlayItems 彼此非常接近 地图放大时看起来不错 但是 如果用户
  • 如何将 Android 添加到 Phonegap 平台版本 3

    经过大量挖掘 我相信这个问题 https stackoverflow com questions 18423444 phonegap 3 doesnt work with andriod studio与我没有添加任何用于构建phonegap
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 在运行时更改用作背景的 Drawable xml 内的形状纯色

    我有一个 Drawable xml 文件 background xml
  • Android模拟器中的网络访问

    我试图通过我的 Android 应用程序访问互联网 但我既成功又失败 我在构建应用程序时启动模拟器 并且应用程序安装得很好 我可以使用浏览器访问互联网 但是 当我尝试这个小代码片段时 InetAddress inet try inet In
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • jetpack compose 是否使用drawable-night 文件夹?

    我们有一个基于视图的 Android 应用程序 其中有一些可绘制对象res drawable文件夹 以及夜间模式的对应文件夹res drawable night folder 使用旧视图时 引用可绘制对象R drawable foo从 XM
  • 如何从namedtuple实例列表创建pandas DataFrame(带有索引或多索引)?

    简单的例子 from collections import namedtuple import pandas Price namedtuple Price ticker date price a Price GE 2010 01 01 30

随机推荐

  • PROFINET的GSD文件描述

    目录 一 基础介绍 二 文件命名 三 文件结构 1 根元素 ISO15745Profile 2 行规头部 ProfileHeader 3 行规体 ProfileBody 3 1 设备标识 DeviceIdentity 3 2 设备功能 De
  • PHP项目修改代码,网页不刷新的可能解决方法之一。有效!

    1 右击鼠标 查看源代码或代码框架 2 刷新代码 然后刷新页面即可
  • 控制GPIO输出——程序设计步骤【HAL】

    GPIO即通用输入输出接口 General purpose Input Output 作为输入时 读取引脚的高低电平 作为输出时 通过输出的高低电平控制外围设备 这里简单介绍GPIO的作为输出的程序设计步骤 整体思路 开启GPIO时钟 选择
  • Windows拍照报错:0xA00F424F PhotoCaptureFileCreationFailed (0x80270200)解决办法

    Windows拍照报错 0xA00F424F PhotoCaptureFileCreationFailed 0x80270200 解决办法 1 为本机照片添加库文件夹 windows 10路径 C Users Administrator A
  • C语言之指针篇【超详细讲解,带你层层深入理解指针】

    目录 一 关于指针 二 指针类型 1 整型指针的访问权限说明 2 字符指针的访问权限说明 3 指针的类型决定向前或向后一步走了多大距离 三 野指针相关知识 1 野指针的成因 指针未初始化 指针的越界访问 指针所指向的空间释放了 2 如何规避
  • 2019 CVPR oral 去模糊论文"DAVANet: Stereo Deblurring with View Aggregation"阅读笔记

    19CVPR 结果早就出来了 最近才读到的19年oral的去模糊工作 博主认真的搜了一下18年的CVPR deblurring 相关的oral为zero 底层图像复原的oral工作也很少 因此 十分兴奋看到deblurring的oral工作
  • Spring源码:PropertyValues类及属性注入二

    主代码 1 RuntimeBeanReference类型 2 RuntimeBeanNameReference类型 3 BeanDefinitionHolder类型 4 BeanDefinition类型 5 ManagedArray类型 6
  • SpringBoot中MyBatis传参的方式

    版本 SpringBoot调用MyBatis访问数据库 依赖为org mybatis spring boot 版本为2 1 2 两种调用方式 两种调用方式为 注解方式和SqlProvider方式 两种方式所遵循的规则相同 无论是否使用 Pa
  • 【php】密码正则格式校验

    密码由字母或数组组成 function is passwd v pattern 0 9a zA Z 6 16 i if preg match pattern v System FileLog FileLog write h5密码重置 tru
  • el-table渲染二级对象数组

    1 序言 项目地址如下 https gitee com liu wenxin complexELTable git 想要渲染这样的数据 el table官网给的例子都是一级对象数组 如果想要渲染二级对象数组 直接 table tableDa
  • 什么是多阶段 Docker 镜像?

    介绍 让我们从基础开始 码头工人 这是一个很棒的工具 可以让您在这些简洁的小容器中创建 部署和运行应用程序 将它们想象成微型虚拟机 但只有足够的资源来运行您的应用程序 这太棒了 因为这意味着您可以在任何平台上运行您的应用程序 从笔记本电脑到
  • Raneto

    Raneto Raneto是一个采用Node js开发的免费开源知识库平台 它使用Markdown文件来存储知识库 Raneto也可以叫作一个 静态网站生成器 因为它不需要数据库 你的所有内容都存储在 Markdown md 文件中 整个知
  • Vue2 +Element-ui实现前端页面

    1 页面项目 以一个简单的前端页面为例 主要是利用vue和element ui实现 里面涉及的主要包括 新建vue项目 一行多个输入框 页面实现等 2 项目流程 1 新建项目 首先安装nodejs 这部分在此就不讲啦 然后安装vue cli
  • 关于BIO、AIO、NIO的 区别于联系

    目录 IO BIO NIO AIO 区别及联系 各自适用场景 使用方式 IO 什么是IO 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口 它对于任何计算机系统都非常关键 因而所有 I O 的主体实际上是内置在操作系统中的
  • 深度学习——贝叶斯神经网络

    文章目录 前言 什么是贝叶斯神经网络 How to train BNN BNN背后的数学原理 pytorch实现BNN 参考文献 前言 本文将总结贝叶斯神经网络 首先 我将简单介绍一下什么是贝叶斯神经网络 BNN 接着我将介绍BNN是怎么训
  • Orcad Captue原理图更改后同步更新到Allegro PCB

    Cadence软件的原理图和PCB是两个软件 原理图到PCB需要创建网表 然后在PCB中放置已经建好分封装的元器件 如果对于已经画好的PCB 后期发现需要更改原理图的某个部分 原理图更改后 怎么同步更新到PCB中 而不变动原来已经布好局 布
  • MySQL备份及恢复

    目录 MySQL备份 MySQL备份方法 备份策略 mysql的完全备份 mysql的增量备份 MySQL恢复 mysql完全恢复 mysql增量备份的恢复 MySQL备份 MySQL备份是基于对MySQL的日志进行备份 且恢复也是通过日志
  • Multispectral Pedestrian Detection using Deep Fusion Convolutional Neural Networks (深度学习多光谱行人检测综述)

    Now salient detection methods most of current pedestrian detectors explored color images of good lighting and they are v
  • 基于Arduino的双向交通灯系统

    学 号 231 姓 名 福福 指导教师 赵志鹏 年 7 月 2 日 实训题目 交通灯系统 1 系统设计 设计要求 设计任务 设计基于Arduino的双向交通灯系统 实现控制和方向显示功能 性能指标要求 1 基本要求 1 按照题目要求独立完成
  • 动态显示带图片列表【Android】

    一 功能描述 1 动态获取服务器端商品信息显示 2 动态加载服务器端图片显示 二 技术点 ListView BaseAdapter JSON数据解析 Handler Thread HttpUrlConnection AsyncTask Ht