Android 在某些手机上缓慢加载自定义listview并强制关闭
我的listview有12个项目和12张图片,大小为600*600,在android emulator上,我看到以下日志:Android 在某些手机上缓慢加载自定义listview并强制关闭,android,multithreading,listview,asynchronous,Android,Multithreading,Listview,Asynchronous,我的listview有12个项目和12张图片,大小为600*600,在android emulator上,我看到以下日志: I/art﹕ Background sticky concurrent mark sweep GC freed 12(432B) AllocSpace objects, 0(0B) LOS objects, 0% free, 45MB/45MB, paused 32.860ms total 102.481ms I/art﹕ Backgroun
I/art﹕ Background sticky concurrent mark sweep GC freed 12(432B) AllocSpace objects, 0(0B) LOS objects, 0% free, 45MB/45MB, paused 32.860ms total 102.481ms
I/art﹕ Background partial concurrent mark sweep GC freed 21(928B) AllocSpace objects, 1(3MB) LOS objects, 3% free, 51MB/53MB, paused 5.177ms total 96.504ms
I/art﹕ Background partial concurrent mark sweep GC freed 43(1664B) AllocSpace objects, 1(3MB) LOS objects, 3% free, 54MB/56MB, paused 1.513ms total 104.015ms
I/Choreographer﹕ Skipped 296 frames! The application may be doing too much work on its main thread.
I/Choreographer﹕ Skipped 65 frames! The application may be doing too much work on its main thread.
不幸的是,这个警告在某些手机上导致了错误(我认为可能是内存不足)
下面是我列表视图的代码,我在谷歌上搜索了上面的错误,知道我必须使用线程。你们能帮我做一下吗
public class ItemActivity extends ActionBarActivity implements Variable {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.album_list);
populatecantactlist();//fill listview with my item
registerClickCallback();//What to do when click on item
}
private void populatecantactlist() {
ListView listview=(ListView)findViewById(R.id.list);
ArrayAdapter<String> adapter=new mylistAdapter();
listview.setAdapter(adapter);
}
public class mylistAdapter extends ArrayAdapter<String>{
private mylistAdapter(){
super(AlbumActivity.this,R.layout.album_list_item,albumnames);
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
View item_view=convertView;
if(item_view== null){
item_view=getLayoutInflater().inflate(R.layout.album_list_item,parent,false);
}
ImageView iv=(ImageView)item_view.findViewById(R.id.imageView1);
iv.setImageResource(icon_num[position]);
TextView tv1=(TextView)item_view.findViewById(R.id.txt_name);
tv1.setText(albumnames[position]);
return item_view;}
}
private void registerClickCallback() {
ListView list=(ListView)findViewById(R.id.list);
list.setOnItemClickListener(new OnItemClickListener() {
//I want to after on each item select go to new activity which populate with
//information about new album
@Override
public void onItemClick(AdapterView<?> parent, View viewclicked,
int position, long id) {
Intent i2=new Intent("com.example.ItemActivity");
Bundle extras=new Bundle();
extras.putInt("PositionItemClicked", position);
i2.putExtras(extras);
startActivity(i2);
}});
}
公共类ItemActivity扩展ActionBarActivity实现变量{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.album_列表);
PopulateCanActList();//用我的项目填充listview
registerClickCallback();//单击项时要做什么
}
私有void populateCanActList(){
ListView ListView=(ListView)findViewById(R.id.list);
ArrayAdapter=新的mylistAdapter();
setAdapter(适配器);
}
公共类mylistAdapter扩展了ArrayAdapter{
私有mylistAdapter(){
超级(AlbumActivity.this,R.layout.album\u list\u项,AlbumName);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图项_View=convertView;
如果(项目视图==null){
item_view=GetLayoutFlater().充气(R.layout.album_list_item,父项,false);
}
ImageView iv=(ImageView)项_view.findViewById(R.id.imageView1);
iv.setImageResource(图标数量[位置]);
TextView tv1=(TextView)item_view.findViewById(R.id.txt_name);
tv1.setText(相册名称[位置]);
返回项_视图;}
}
私有无效注册表ClickCallback(){
ListView列表=(ListView)findViewById(R.id.list);
list.setOnItemClickListener(新的OnItemClickListener(){
//我想在每个项目上选择“转到新活动”,该活动以
//关于新专辑的信息
@凌驾
公共视图单击(AdapterView父级,视图单击,
内部位置,长id){
意图i2=新意图(“com.example.ItemActivity”);
Bundle extras=新Bundle();
额外输入(“PositionItemClicked”,位置);
i2.临时演员(临时演员);
星触觉(i2);
}});
}
更新:我使用下面的异步,但它有错误:
public class MyAsync extends AsyncTask<Void,String,Void>{
@Override
protected Void doInBackground(Void... params) {
iv.setImageResource(icon_num[position]);
return null;
}
@Override
protected void onPreExecute() {
}
}
公共类MyAsync扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
iv.setImageResource(图标数量[位置]);
返回null;
}
@凌驾
受保护的void onPreExecute(){
}
}
您是否尝试在asynktask中加载适配器?我搜索asynctask,刚刚找到加载url图像的方法,您能帮我吗?只在asynktask中添加您的方法。在onPostExecute中