ImageLoader(多线程网络图片加载)+本地缓存 for windowsphone 7
搞了好长一阵子wp,做点好事。
C/S手机app中应用最多的是 获取网络图片,缓存到本地,展示图片
本次主要对其中的delay:LowProfileImageLoader进行修改,在获取图片的时候,加入本地缓存,和弱引用。
demo截图:
缓存相关:
1,App.xml.cs文件中通过IsolatedStorageFile创建缓存图片用的文件夹
// 应用程序启动(例如,从“开始”菜单启动)时执行的代码
// 此代码在重新激活应用程序时不执行
private void Application_Launching(object sender, LaunchingEventArgs e)
{
string imageCacheDriectory = "ImagesCache";
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
if (store.DirectoryExists(imageCacheDriectory) != true)
{
store.CreateDirectory(imageCacheDriectory);
}
}
}
2,LowProfileImageLoader.cs中 image在uri修改的事件中加入判断,如果本地已经缓存图片文件,直接读取本地;如果本地没有缓存,则通过网络获取,并缓存到本地
private static void OnUriSourceChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var image = (Image)o;
var uri = (Uri)e.NewValue; if (!IsEnabled || DesignerProperties.IsInDesignTool)
{
// Avoid handing off to the worker thread (can cause problems for design tools)
image.Source = new BitmapImage(uri);
}
else
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
string imageCacheFileName = App.IMAGECACHEDIRECTORY + ToInternalKey(uri.ToString()); if (store.FileExists(imageCacheFileName))
{
// check local image file
BitmapImage bitmapImage = new BitmapImage();
using (var imageStream = store.OpenFile(imageCacheFileName, FileMode.Open, FileAccess.Read))
{
bitmapImage.SetSource(imageStream);
}
WeakReference<BitmapImage> mybitimage = new WeakReference<BitmapImage>(bitmapImage);
image.Source = mybitimage.Target;
}
else
{
// Clear-out the current image because it's now stale (helps when used with virtualization)
image.Source = null;
lock (_syncBlock)
{
// Enqueue the request
_pendingRequests.Enqueue(new PendingRequest(image, uri));
Monitor.Pulse(_syncBlock);
}
}
}
}
} static String ToInternalKey(String value)
{
if (String.IsNullOrEmpty(value))
{
return String.Empty;
}
String exName = value.Substring(value.LastIndexOf('.')); byte[] bytes = UTF8Encoding.GetBytes(value);
return Convert.ToBase64String(bytes) + exName;
}
private static readonly Encoding UTF8Encoding = Encoding.UTF8;
3,Mainpage.xmal.cs中 相应清除缓存按钮事件中。查找缓存图片的文件夹,找到所有文件并逐个删除。(注:清除缓存图片过程中不能直接删除文件夹,且在移除的过程中要注意相关路劲是否正确,否则缓存并没有移除成功)
/// <summary>
/// 清除缓存
/// </summary>
private void btn_clear_Click(object sender, RoutedEventArgs e)
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
if (store.DirectoryExists("ImagesCache") == true)
{
string[] filelist = store.GetFileNames("ImagesCache/");
foreach (string st in filelist)
{
store.DeleteFile("ImagesCache/"+st);
}
}
}
MessageBox.Show("图片缓存清理完毕");
if (images != null)
images.Clear();
}
核心的获取网络代码是 微软一个叫David Anson所写的demo中所摘取,
其作用是:
在应用后台开多一个线程用于获取网络图片,优化ui线程。简化相关开发代码。
具体见:
第一次写博客,欢迎大神拍砖
下载demo请戳:http://files.cnblogs.com/fatlin/ImageLoader.rar
ImageLoader(多线程网络图片加载)+本地缓存 for windowsphone 7的更多相关文章
- Glide 4.0.0 下之加载本地缓存的图片
在网上搜了下,无意中发现RequestOptions还有个方法: onlyRetrieveFromCache 用了下是OK的 try { File imageFile = Glide.with(con ...
- 55、Android网络图片 加载缓存处理库的使用
先来一个普通的加载图片的方法. import android.annotation.SuppressLint; import android.app.Activity; import and ...
- 【代码笔记】iOS-实现网络图片的异步加载和缓存
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...
- android ImageLoader加载本地图片的工具类
import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; /** * 异步 ...
- Flutter -------- 加载本地图片资源和网络图片
在Flutter加载本地图片资源 在Flutter项目目录下创建文件夹 images ,在文件夹中添加几张图片 指定资源 pubspec.yaml文件中 version: 1.0.0+1 enviro ...
- imageview加载本地和网络图片
ImageView是Android程序中经常用到的组件,它将一个图片显示到屏幕上. 在UI xml定义一个ImageView如下: public void onCreate(Bundle savedI ...
- Android 多线程 异步加载
Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...
- Android艺术——Bitmap高效加载和缓存(1)
通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是: 图片的同步加载:图片的异步加载:图片的压缩:内存缓存:磁盘缓存:网络获取: 1.加载 首先提到加载:BitmapFact ...
- Android之网络图片加载的5种基本方式
学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助. 此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection.H ...
随机推荐
- SAP BW 重新初始化
- 高级I/O之记录锁
若两个人同时编辑一个文件,其后果将如何呢?在很多UNIX系统中,该文件的最后状态取决于写该文件的最后一个进程.但是对于有些应用程序(例如数据库),进程有时需要确保它正在单独写一个文件.为了向进程提供这 ...
- google maps api申请的问题
现在已经改由统一的GOOGLE API控制台进行所有GOOGLE API的管理了. 方法是使用Google帐号登入 https://code.google.com/apis/console. 然后在所 ...
- GLOG使用注意事项
FLAGS_stderrthreshold 输出到stderr的门限,默认为2(ERROR),默认,ERORR以下的信息不打印到终端 FLAGS_alsologtostderr 当这个全局变量 ...
- Npoi 导出Excel 下拉列表异常: String literals in formulas can't be bigger than 255 Chars ASCII
代码: public static void dropDownList(string[] datas, string filePath) { HSSFWorkbook workbook = new H ...
- W3C XML Schema 教程
转自:http://www.blogjava.net/sham2k/articles/179825.html W3C XML Schema 教程 XML SCHEMA教程 本教程是笔者学习W3C的&l ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)【转】
介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对象的访问. MessageModel ...
- ORACLE 导入导出操作
1.导入命令: imp userId/psw@orcl full=y file=D:\data\xxx.dmp ignore=y 2.导出命令 exp userId/psw@orcl file=d: ...
- 最简单的Linux-ACL操作
添加ACL setfacl -m u:'username':rw 'dir or file' "-R可以迭代式的给目录下所有文件都添加相同的ACL" 查看ACL规则 getfa ...
- 创建触发器在表中播入数据时ID自动增长
),age )) create or replace trigger gger_tt before insert on ttt for each row when (new.id is null) b ...