Android异步任务重载
我正在开发一个应用程序,使用AsyncTask+for loop从SD卡加载大量图像,我已经在我的Galaxy Nexus上测试了该应用程序,该应用程序运行良好,但如果我使用超过33个loop,它将崩溃 我的问题是:使用AsyncTask有限制吗???,,,我的代码中有什么错误导致33个循环的崩溃吗 请帮忙,这是我的代码: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
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文档。