搞了好长一阵子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线程。简化相关开发代码。

具体见:

http://blogs.msdn.com/b/delay/archive/2010/09/02/keep-a-low-profile-lowprofileimageloader-helps-the-windows-phone-7-ui-thread-stay-responsive-by-loading-images-in-the-background.aspx?Redirected=true

http://blogs.msdn.com/b/delay/archive/2010/09/08/never-do-today-what-you-can-put-off-till-tomorrow-deferredloadlistbox-and-stackpanel-help-windows-phone-7-lists-scroll-smoothly-and-consistently.aspx

第一次写博客,欢迎大神拍砖

下载demo请戳:http://files.cnblogs.com/fatlin/ImageLoader.rar

ImageLoader(多线程网络图片加载)+本地缓存 for windowsphone 7的更多相关文章

  1. Glide 4.0.0 下之加载本地缓存的图片

    在网上搜了下,无意中发现RequestOptions还有个方法: onlyRetrieveFromCache 用了下是OK的 try { File imageFile = Glide.with(con ...

  2. 55、Android网络图片 加载缓存处理库的使用

         先来一个普通的加载图片的方法. import android.annotation.SuppressLint; import android.app.Activity; import and ...

  3. 【代码笔记】iOS-实现网络图片的异步加载和缓存

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...

  4. android ImageLoader加载本地图片的工具类

    import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; /** * 异步 ...

  5. Flutter -------- 加载本地图片资源和网络图片

    在Flutter加载本地图片资源 在Flutter项目目录下创建文件夹 images ,在文件夹中添加几张图片 指定资源 pubspec.yaml文件中 version: 1.0.0+1 enviro ...

  6. imageview加载本地和网络图片

    ImageView是Android程序中经常用到的组件,它将一个图片显示到屏幕上. 在UI xml定义一个ImageView如下: public void onCreate(Bundle savedI ...

  7. Android 多线程 异步加载

    Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...

  8. Android艺术——Bitmap高效加载和缓存(1)

    通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是: 图片的同步加载:图片的异步加载:图片的压缩:内存缓存:磁盘缓存:网络获取: 1.加载 首先提到加载:BitmapFact ...

  9. Android之网络图片加载的5种基本方式

    学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助. 此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection.H ...

随机推荐

  1. [Angular 2] Value Providers & @Inject

    Dependecies aren’t always objects created by classes or factory functions. Sometimes, all we really ...

  2. yii 隐藏index.php的步骤

    Apache 1.开启apache的mod_rewrite模块       去掉LoadModule rewrite_module modules/mod_rewrite.so前的“#”符号     ...

  3. NopCommerce Html扩展方法Html.Widget

    在Nop中有一个Html扩展的类叫HtmlExtensions,主要源码: public static class HtmlExtensions { #region Admin area extens ...

  4. centos中samba配置后始终连不上的绝招

    奶奶的,按照网上的办法改了/etc/samba/smb.conf配置文件,结果在win7里面死活连不上,后来发现是防火墙的问题. 有两个命令必须要执行: 1.将SELIUNX设置成disabled或者 ...

  5. CSS skills: 2) change hover dynamically by js

    //命名空间 var base = {}; //class base.gClass={}; //鼠标hover交互方法: 注册对象的hover的class特性以及mouseMoveIn,mouseMo ...

  6. SQL Server 日期 时间类型

    --1毫秒=0.001秒 --1微秒=0.000 001秒 --1纳秒=0.000 000 001秒 --datetime精度不大好,末尾值只能是这3种: .000, .003, or .007 -- ...

  7. Linux vsftp

    本机环境CentOS-6.6-i386-bin-DVD1.iso安装盘.安装时选择minimal模式.本机IP地址配置为192.168.0.211. 1.查询系统是否已安装了vsftpd [root@ ...

  8. [改善Java代码]注意Class类的特殊性

    Java语言是先把Java源文件编译成后缀为class的字节码文件,然后再通过ClassLoader机制把这些类文件加载到内存中,最后生成实例执行的,这是Java处理的基本机制,但加载到内存中的数据是 ...

  9. 每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  10. Activity的启动模式(android:launchMode)

    在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...