java在listview中显示图像:应用程序可能在其主线程上做了太多工作
我有一个在listview中显示一些本地图像的应用程序。当我运行应用程序时,logcat会说
Skipped 43 frames! The application may be doing too much work on its main thread.
任何建议都会有帮助,谢谢
这是密码
主要活动。爪哇
import 安卓.app.Activity;
import 安卓.support.v7.app.AppCompatActivity;
import 安卓.os.Bundle;
import 安卓.view.View;
import 安卓.widget.AdapterView;
import 安卓.widget.ListView;
import 安卓.widget.Toast;
public class MainActivity extends Activity {
ListView list;
String[] web = {
"Google Plus",
"Twitter",
"Tall",
};
Integer[] imageId = {
R.drawable.gggggggggg,
R.drawable.hhhhhhhhhh,
R.drawable.ttttttttttt
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomList adapter = new
CustomList(MainActivity.this, web, imageId);
list=(ListView)findViewById(R.id.list);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +web[+ position], Toast.LENGTH_SHORT).show();
}
});
}
}
这是客户名单。爪哇
import 安卓.app.Activity;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.ArrayAdapter;
import 安卓.widget.ImageView;
import 安卓.widget.ListAdapter;
import 安卓.widget.TextView;
import java.util.ArrayList;
public class CustomList extends ArrayAdapter<String>{
private final Activity context;
private final Integer[] imageId;
public CustomList(Activity context,
String[] web, Integer[] imageId) {
super(context, R.layout.list_single, web);
this.context = context;
this.imageId = imageId;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView= inflater.inflate(R.layout.list_single, null, true);
ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
imageView.setImageResource(imageId[position]);
return rowView;
}
}
# 1 楼答案
使用AsyncTask并在AsyncTask中完成所有工作。 AsyncTask允许正确且轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序
https://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/
# 2 楼答案
您可以尝试使用
ViewHolder
模式来优化ListView
的性能请参见此处:https://dzone.com/articles/optimizing-your-listview
# 3 楼答案
1)使用
viewHolder
保存所有的.findViewById
-因为这对于android来说是一项繁重的操作,现在它总是在你滚动时调用它2)为了更好地加载图像,请使用来自
Volley
库的ImageLoader
,它具有图像缓存,您将节省大量ram3)对于项目的点击,在适配器中组织接口,然后在活动中实现它,所以点击后,您将能够在活动中调用接口和操作