Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在后台执行位图转换_Android_Gridview_Bitmap - Fatal编程技术网

Android 在后台执行位图转换

Android 在后台执行位图转换,android,gridview,bitmap,Android,Gridview,Bitmap,在我的应用程序中,我想在后台执行位图转换,因为我面临内存泄漏问题。我知道,它可以通过异步任务来完成,但不知道如何做到这一点。下面是我的代码 package com.android.album3; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import android.app.Activity; import androi

在我的应用程序中,我想在后台执行位图转换,因为我面临内存泄漏问题。我知道,它可以通过异步任务来完成,但不知道如何做到这一点。下面是我的代码

package com.android.album3;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

public class Album3Activity extends Activity 
{
File [] mediaFiles;
File imageDir;
static GridView gridView;
ImageAdapter adapter;
Intent in;
String name = null;
ArrayList<Bitmap> bmpArray = new ArrayList<Bitmap>();
ArrayList<String> fileName = new ArrayList<String>();
public static final String TAG = "Album3Activity";
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    imageDir = new File(Environment.getExternalStorageDirectory().toString()+
             "/diplomat");
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    if(imageDir.exists())
    {
        setContentView(R.layout.grid);
        mediaFiles = imageDir.listFiles();
        //Log.d("Length of images",""+mediaFiles.length);
        for(File file : mediaFiles)
        {
            bmpArray.add(convertToBitmap(file));
            fileName.add(readFileName(file));
            Log.d(TAG + "bmpArray Size", ""+bmpArray.size());
            Log.d(TAG, "call to convertToBitmap");
        }//for

        adapter = new ImageAdapter(this, bmpArray, fileName);
        gridView = (GridView)findViewById(R.id.gridview);
        gridView.setAdapter(adapter);
        gridView.setOnItemClickListener(new OnItemClickListener() 
        {

        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long arg3) 
        {
            in = new Intent(getApplicationContext(), FullScreen.class);
            in.putExtra("id", position);
            startActivity(in);
        }//onItemClick
    });
    }//if
    else
    {
        setContentView(R.layout.no_media);
        //Toast.makeText(Album3Activity.this, "No files available", Toast.LENGTH_SHORT).show();
    }//else
}//onCreate

public static Bitmap convertToBitmap(File file) 
{
    URL url = null;
    try 
    {
        url = file.toURL();
    }//try 
    catch (MalformedURLException e1) 
    {
        Log.d(TAG, e1.toString());
    }//catch

    Bitmap bmp = null;
    try
    {
       bmp = BitmapFactory.decodeStream(url.openStream());
       //bmp.recycle();
    }//try
    catch(Exception e)
    {
        Log.d(TAG, "Exception: "+e.toString());
    }//catch
    return bmp;
}//convertToBitmap

public String readFileName(File file)
{
    String name = file.getName();
    return name;
}//readFileName
}//class
package com.android.album3;
导入java.io.File;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.app.ProgressDialog;
导入android.content.Intent;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.os.Bundle;
导入android.os.Environment;
导入android.util.Log;
导入android.view.view;
导入android.view.Window;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.GridView;
公共类Album3Activity扩展活动
{
文件[]媒体文件;
文件imageDir;
静态网格视图;
图像适配器;
意图;
字符串名称=null;
ArrayList bmpArray=新的ArrayList();
ArrayList文件名=新的ArrayList();
公共静态最终字符串标记=“Album3Activity”;
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
imageDir=新文件(Environment.getExternalStorageDirectory().toString())+
“/外交官”);
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
if(imageDir.exists())
{
setContentView(R.layout.grid);
mediaFiles=imageDir.listFiles();
//Log.d(“图像长度”,“”+mediaFiles.Length);
用于(文件:mediaFiles)
{
bmpArray.add(convertToBitmap(文件));
添加(readFileName(file));
Log.d(标记+“bmpArray大小”,“bmpArray.Size()”);
Log.d(标记“调用convertToBitmap”);
}//为了
adapter=新的ImageAdapter(此,bmpArray,文件名);
gridView=(gridView)findViewById(R.id.gridView);
setAdapter(适配器);
setOnItemClickListener(新的OnItemClickListener()
{
公共单击(适配器视图arg0,视图arg1,内部位置,
长arg3)
{
in=新意图(getApplicationContext(),FullScreen.class);
in.putExtra(“id”,位置);
星触觉(in);
}//麦克里克
});
}//如果
其他的
{
setContentView(右布局,无媒体);
//Toast.makeText(Album3Activity.this,“无可用文件”,Toast.LENGTH_SHORT.show();
}//否则
}//一次创建
公共静态位图convertToBitmap(文件)
{
URL=null;
尝试
{
url=file.toURL();
}//试一试
捕获(格式错误的异常e1)
{
Log.d(标记,e1.toString());
}//抓住
位图bmp=null;
尝试
{
bmp=BitmapFactory.decodeStream(url.openStream());
//bmp.recycle();
}//试一试
捕获(例外e)
{
Log.d(标记“Exception:+e.toString());
}//抓住
返回bmp;
}//转换比特图
公共字符串readFileName(文件)
{
字符串名称=file.getName();
返回名称;
}//读取文件名
}//阶级

您正面临类似内存的问题,因为您的图像太大,所以您必须像这样使用BitmapFactory对该图像进行解码

BitmapFactory.Options option = new BitmapFactory.Options();
                option.inSampleSize = 2;//any integer value greater than 1
                Bitmap bm = BitmapFactory.decodeFile(root.getPath() + "/"
                        + imageName,option);
                imageView.setImageBitmap(bm);
如果设置为值>1,则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存。样本大小是任一维度中对应于解码位图中单个像素的像素数。例如,inSampleSize==4返回的图像的宽度/高度为原始图像的1/4,像素数为1/16。任何价值