Java 在listview中显示图像:应用程序可能在其主线程上做了太多工作

Java 在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

我有一个在listview中显示一些本地图像的应用程序。当我运行应用程序时,logcat会说

跳过43帧!应用程序可能在其主线程上做了太多工作

任何建议都会有帮助,谢谢

这是密码

MainActivity.java

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) 对于项目的点击,在适配器中组织接口,然后在活动中实现它,所以点击后,您将能够在活动中为它们调用接口和操作