更快地加载位图

时间:2011-06-04 11:23:01

标签: android bitmap bufferedinputstream

根据以下链接:

http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

如果您自己进行缓冲,则可以加快位图(或任何文件)的加载速度(即,不使用BufferedInputStream,而是自己处理缓冲)。

特别是,方法4看起来很有希望(一次啜饮整个文件)。但是,我不知道如何在android中实现它。这是Java代码:

import java.io.*;

public class readfile {
 public static void main(String args[]) {
  if (args.length != 1) {
    System.err.println("missing filename");
    System.exit(1);
  }
  try {
    int len = (int)(new File(args[0]).length());
    FileInputStream fis =
        new FileInputStream(args[0]);
    byte buf[] = new byte[len];
    fis.read(buf);
    fis.close();
    int cnt = 0;
    for (int i = 0; i < len; i++) {
      if (buf[i] == '\n')
        cnt++;
    }
    System.out.println(cnt);
  }
  catch (IOException e) {
    System.err.println(e);
  }
 }

}

1 个答案:

答案 0 :(得分:0)

此技术未针对Android进行优化,可能会运行不佳。惯例是使用AndroidHttpClient

  

使用合理的默认设置和Android注册方案配置的Apache DefaultHttpClient的子类,还允许用户添加HttpRequestInterceptor类。

如果你真的想使用上面的Sun代码,你应该小心,因为当文件大小超过应用程序可用的堆空间量时,你可能会超过VM堆预算。

首先使用ActivityManager检查是否有足够的堆空间是明智的。另请参阅the elaborate answer to this question

修改

found an example通过POST发送一个InputStream。此处正在从资源(res/data.xml)中读取文件,但您可以使用代码段中的InputStream替换FileInputStream。将InputStream转换为字节数组与代码基本相同:将整个文件读入内存并将其推送到请求中。这是OutOfMemoryError s的臭名昭着的原因,因此请注意不要读取太大的文件(我建议不要超过1 MB)。

public void executeMultipartPost() throws Exception {
    try {
        InputStream is = this.getAssets().open("data.xml");
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost postRequest = new HttpPost("http://w3mentor.com/Upload.aspx");
        byte[] data = IOUtils.toByteArray(is);
        InputStreamBody isb = new InputStreamBody(new ByteArrayInputStream(data),"uploadedFile");
        StringBody sb1 = new StringBody("someTextGoesHere");
        StringBody sb2 = new StringBody("someTextGoesHere too");
        MultipartEntity multipartContent = new MultipartEntity();
        multipartContent.addPart("uploadedFile", isb);
        multipartContent.addPart("one", sb1);
        multipartContent.addPart("two", sb2);
        postRequest.setEntity(multipartContent);
        HttpResponse res = httpClient.execute(postRequest);
        res.getEntity().getContent().close();
    } catch (Throwable e) {
        // handle exception here
    }
}