2012-04-07 31 views
1

我已经下载了网页html和其中的图像。现在,我试图将它们展示给用户。我已经尝试了两种不同的方法,并且不确定哪个最适合使用。两者都有他们的问题。试图加载下载的网页和图像

首先,我试着用下面的代码文本视图:

TextView content = (TextView)findViewById(R.id.article_content); 

MyImageGetter mig = new MyImageGetter(this, urlId); 
Spanned span = Html.fromHtml(contents, mig, null); 
content.setText(span); 

我真的很喜欢这是如何工作的,但有两个问题。第一个,也是最困难的是,当一篇文章有​​很多图像时,我会得到OutOfMemory fc's。 MyImageGetter代码如下

public class MyImageGetter implements Html.ImageGetter{ 

String urlId = null; 
Context c = null; 

public MyImageGetter(ArticleViewer articleViewer, String urlId2) { 
    c = articleViewer; 
    urlId = urlId2; 
} 

public Drawable getDrawable(String source) { 
    String[] brokenUrl = source.split("/"); 
    String imgName = brokenUrl[brokenUrl.length-1]; 

    File image = new File("/data/data/com.that1dev.RibbonReader/Offline/" + urlId + "/" + imgName); 
    Log.w("MyApp", image.getAbsolutePath()); 
    Bitmap bm = BitmapFactory.decodeFile(image.getAbsolutePath()); 

    Drawable d = new BitmapDrawable(c.getResources(), bm); 

    d.setBounds(0,0, d.getIntrinsicWidth(),d.getIntrinsicHeight()); 

    return d; 
} 

} 

另一个问题是textview根据用户选择和设备方向有不同的宽度。如果视图中的图像大于文本视图宽度,则会简单地进行裁剪。但是,我相信我可以自己解决这个问题,而不会太困难。我只是没有尝试过,因为我试图先解决内存问题。但是,任何协助都将不胜感激。

我试过的另一种方法是webview。

WebView webContent = (WebView)findViewById(R.id.web_content); 

webContent.loadDataWithBaseURL("", contents[1], "text/html", "utf-8", ""); 
webContent.setBackgroundColor(Color.TRANSPARENT); 

不幸的是,无论我尝试什么,背景都保持白色,并且令人难以置信的难看。我似乎无法找到适用于3.0和4.0的解决方案。

如果我有选择,我真的很喜欢TextView方法的工作,因为我更喜欢它的外观与WebView呈现的东西的方式。

回答

1

你在这里试图做的是从根本上改变网络内容的呈现方式 - 交换网站作者(可能是你,我不知道)写的背景是什么。反正HTML真的不支持Web内容的透明背景,所以我能想到的唯一的东西你可以尝试是实际编辑通过JavaScript的网页内容:

myWebView.loadUrl("javascript:document.body.style.backgroundImage=\'\'); 
    document.body.style.backgroundColor=\"#00FF00\");"); 

(与替换以上颜色你选择的颜色)调用WebView加载后将清除HTML上的任何背景,但是当涉及任何嵌入式样式时,你仍然会遇到问题。

至于你的图像问题,你打开所有图像的默认大小,并保持在内存中。 WebView为您做的一件事就是保持网页图像的十进制渲染(如缩小)。如果你想修复你的内存占用,你最好的选择就是暂时将图像保存到磁盘上,并且只有当用户滚动到图像需要的位置时才打开它们 - 这一切都不容易,但这是确保您不会溢出分配的堆空间的唯一方法。

+0

webview图像和textview图像如何不同大小?这两个都是在图像加载大约300x500。 webview如何进一步缩小呢?其他应用程序能够完成这一点(透明的网络视图或内存安全的文本视图),并且这种做法已经足够普遍(几乎每个离线rss阅读器),我不会想象它会非常困难。 – 2012-04-07 20:29:46

+0

我不确定这一点,但我认为webview正在抽取图像以在屏幕上显示它们 - 它可能不是。但是,当然最大的问题是如果你能避免它们,就不要一次把它们都放在内存中。它也可能有助于在清单中将您的应用程序标记为需要超过默认堆空间 – JRaymond 2012-04-07 20:41:04

+0

感谢关于堆空间的提示。这就是我所寻找的诀窍。这看起来是处理如此大量图像的唯一方法。如果可以的话,我仍然会尝试让webview工作,因为我无法使用这么多内存,但目前为止这很棒。 – 2012-04-07 21:30:47