Android异步任务重载

Android异步任务重载,android,for-loop,android-asynctask,Android,For Loop,Android Asynctask,我正在开发一个应用程序,使用AsyncTask+for loop从SD卡加载大量图像,我已经在我的Galaxy Nexus上测试了该应用程序,该应用程序运行良好,但如果我使用超过33个loop,它将崩溃 我的问题是:使用AsyncTask有限制吗???,,,我的代码中有什么错误导致33个循环的崩溃吗 请帮忙,这是我的代码: ImageView iv; TextView tv; String picsDir; int picsAmount; String [] list;File dir; @O

我正在开发一个应用程序,使用AsyncTask+for loop从SD卡加载大量图像,我已经在我的Galaxy Nexus上测试了该应用程序,该应用程序运行良好,但如果我使用超过33个loop,它将崩溃

我的问题是:使用AsyncTask有限制吗???,,,我的代码中有什么错误导致33个循环的崩溃吗

请帮忙,这是我的代码:

ImageView iv;
TextView tv;
String picsDir;
int picsAmount;
String [] list;File dir;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //images folder
    picsDir = Environment.getExternalStorageDirectory().toString()+"/aFolder";

    // total images 
    picsAmount = 70;

    iv = (ImageView)findViewById(R.id.iv);
    tv = (TextView)findViewById(R.id.tv);

    list = new String [picsAmount];
    dir = new File (picsDir);           

    // String array of my images names
    list = dir.list();

    new loadingImgs().execute(list);
}

class loadingImgs extends AsyncTask<String, Void, Drawable>{

    @Override
    protected void onPreExecute() {
        // nothing
        super.onPreExecute();
    }

    @Override
    protected Drawable doInBackground(String... params) {

        String dir1 = Environment.getExternalStorageDirectory().toString()+"/aFolder";

        String[] theList = params;
        Bitmap[] bmp = new Bitmap[picsAmount];
        Drawable[] drw = new Drawable[picsAmount];

        tv.setText("dir1="+dir1+"  found= "+picsAmount);            
        File dir = new File(dir1);          



        for (int i = 0; i < picsAmount; i++){
            bmp[i] = BitmapFactory.decodeFile(dir+"/"+theList[i]);
            drw[i] = new BitmapDrawable(getResources(), bmp[i]);        
        }           

        return drw[0];
    }

    protected void onPostExecute(Drawable result) {

        // set drw[0] as iv image
        iv.setImageDrawable(result);


        };

}
ImageView-iv;
文本视图电视;
字符串picsDir;
国际皮萨蒙特;
字符串[]列表;文件目录;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//图像文件夹
picsDir=Environment.getExternalStorageDirectory().toString()+“/aFolder”;
//总图像
皮萨蒙特=70;
iv=(ImageView)findViewById(R.id.iv);
tv=(TextView)findviewbyd(R.id.tv);
列表=新字符串[picsAmount];
dir=新文件(picsDir);
//我的图像名称的字符串数组
list=dir.list();
新加载imgs().execute(列表);
}
类装入IMGS扩展异步任务{
@凌驾
受保护的void onPreExecute(){
//没什么
super.onPreExecute();
}
@凌驾
受保护的可抽出式doInBackground(字符串…参数){
字符串dir1=Environment.getExternalStorageDirectory().toString()+“/aFolder”;
字符串[]列表=参数;
位图[]bmp=新位图[picsAmount];
可提取[]drw=新的可提取[picsAmount];
tv.setText(“dir1=“+dir1+”found=“+picsAmount”);
文件目录=新文件(目录1);
对于(int i=0;i

}崩溃时会出现什么样的错误

这是“OutOfMemoryException”吗

当然,您可以使用的循环数没有严格限制:)

你只是在堆上分配了太多的空间,可能超过了你的设备对每个应用程序的处理能力


使用
ActivityManager
上的
getMemoryClass()
获取有关您环境的详细信息。

位图
s。您应该避免同时在内存中存储这么多的数据。

请指定“崩溃”是什么意思?你能发布你的堆栈跟踪吗?它会崩溃,内存溢出异常?是的,除非那些图像很小,否则你可能会耗尽内存。除了不一次加载那么多图像之外,没有真正的解决方案。您真的需要同时在屏幕上显示所有这些内容吗?如果不是,一个LRUCache来保存屏幕上的内容并按需加载会更好。没错,在日志cat:dalvikvm heap Out memory Out on 3456016 byte allocation中,现在的交易是什么??我之所以使用for循环是因为我有这么多的图像,我不想一个一个地导入它们,这就是为什么我使用for循环,在这种情况下,我应该做什么或修改以使用for循环我应该做什么,我想使用for循环加载100多个图像,为什么要避免这个错误?为什么在内存中同时需要100个图像?使用
for
循环,在每次迭代中,加载位图,从中创建可绘制位图并回收位图。will,你说得对,我有大约600mb的ram,但是图像太小了,它们的总大小约为3mb,而且每个都约为30kb,使用for循环快速导入时如何避免此错误您提到的总大小可能是用于压缩PNG或JPEG图像。位图是未压缩的,内存中每个像素占用四个字节。我猜您的图像是720×1200,这使得每个图像有3.3个MiB。@user3843006您肯定没有接近600mb的RAM可用。如今,大多数手机的每个app/linux进程限制为24MB。查看ActivityManager文档。