Java 在listview中显示图像:应用程序可能在其主线程上做了太多工作
我有一个在listview中显示一些本地图像的应用程序。当我运行应用程序时,logcat会说 跳过43帧!应用程序可能在其主线程上做了太多工作 任何建议都会有帮助,谢谢 这是密码 MainActivity.javaJava 在listview中显示图像:应用程序可能在其主线程上做了太多工作,java,android,multithreading,listview,Java,Android,Multithreading,Listview,我有一个在listview中显示一些本地图像的应用程序。当我运行应用程序时,logcat会说 跳过43帧!应用程序可能在其主线程上做了太多工作 任何建议都会有帮助,谢谢 这是密码 MainActivity.java import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import andro
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.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();
}
});
}
}
导入android.app.Activity;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ListView;
导入android.widget.Toast;
公共类MainActivity扩展了活动{
列表视图列表;
字符串[]web={
“谷歌+”,
“推特”,
“高”,
};
整数[]图像ID={
R.drawable.gggggggggg,
R.drawable.hhhhhhhh,
R.drawable.ttttttttt
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomList适配器=新建
CustomList(MainActivity.this、web、imageId);
list=(ListView)findViewById(R.id.list);
list.setAdapter(适配器);
list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
Toast.makeText(MainActivity.this,“您在“+web[+position],Toast.LENGTH_SHORT.show]上单击过它”);
}
});
}
}
下面是CustomList.java
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.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;
}
}
导入android.app.Activity;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.ListAdapter;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类CustomList扩展了ArrayAdapter{
私人最终活动背景;
私有最终整数[]imageId;
公共自定义列表(活动上下文,
字符串[]web,整数[]imageId){
super(上下文、R.layout.list_single、web);
this.context=上下文;
this.imageId=imageId;
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
视图行视图=充气机。充气(R.layout.list_single,null,true);
ImageView ImageView=(ImageView)rowView.findViewById(R.id.img);
setImageResource(imageId[位置]);
返回行视图;
}
}
使用AsyncTask并在AsyncTask中完成所有工作。
AsyncTask允许正确且轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序
使用AsyncTask并在AsyncTask中完成所有工作。 AsyncTask允许正确且轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序
您可以尝试使用
ViewHolder
模式来优化列表视图的性能
请参见此处:您可以尝试使用ViewHolder
模式来优化列表视图的性能
请参见此处:1)使用viewHolder
保存所有的。findViewById
-因为这对于android来说是一项繁重的操作,现在在滚动时,它总是调用它
2) 为了更好地加载图像,请使用Volley
库中的ImageLoader
,它具有图像缓存,可以节省大量内存
3) 对于项目的点击,在适配器中组织界面,然后在活动中实现它,所以点击后,您将能够调用界面并在活动中为其执行操作。1)使用viewHolder
保存所有。findViewById
-因为这对于android来说是一项繁重的操作,现在它总是在运行时调用它正在滚动
2) 为了更好地加载图像,请使用Volley
库中的ImageLoader
,它具有图像缓存,可以节省大量内存
3) 对于项目的点击,在适配器中组织接口,然后在活动中实现它,所以点击后,您将能够在活动中为它们调用接口和操作