我如何使用异步任务

时间:2015-11-05 20:14:10

标签: android view android-asynctask

如何将其添加到android中的Async任务中。该视图占据了大部分主线程,所以我试图把它放在新的线程中。

public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder = new ViewHolder();

    convertView = inflater.inflate(R.layout.gridview_layout, null);
    holder.txt = (TextView) convertView.findViewById(R.id.txt);
    holder.flag = (ImageView) convertView.findViewById(R.id.flag);

    holder.txt.setText(result[position]);
    holder.flag.setImageResource(imageId[position]);

    convertView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, DetailActivity.class).putExtra(Intent.EXTRA_TEXT, result[position]);
            context.startActivity(intent);
        }
    });

    return convertView;
}

另一个班级是这样的。我不明白什么是主线程的大部分用途

public static class DetailFragment extends Fragment {

    public DetailFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_detail, container, false);
        Intent intent = getActivity().getIntent();
        if (intent != null && intent.hasExtra(Intent.EXTRA_TEXT)) {
            String forecastStr = intent.getStringExtra(Intent.EXTRA_TEXT);
            ((TextView) rootView.findViewById(R.id.detail_text)).setText(forecastStr);
        }

        return rootView;
    }

}

2 个答案:

答案 0 :(得分:0)

你错了,因为UI的大多数操作应该在主线程上(并且更新UI应该总是在主线程上)。

可能还有另一个代码占用了大部分主线程(URL请求,从磁盘加载文件,数据解析等)。

但这是AsyncTask用法的一个例子:

AsyncTask.execute(new Runnable() {
     @Override
     public void run() {
         //code here
     }
});

答案 1 :(得分:0)

您没有正确使用ViewHolder模式。

ViewHolder模式的想法是限制布局膨胀的数量和昂贵的操作,如findViewById()。您的实现完全忽略convertView并每次都为新布局充气!

如果您的布局很复杂,这可能会导致性能受到明显影响。

更好的实施方式是:

public View getView(final int position, View convertView, ViewGroup parent) {

    final ViewHolder holder;
    if (convertView != null) {
        holder = (ViewHolder) convertView.getTag();
    }
    else {
        holder = new ViewHolder();  
        convertView = inflater.inflate(R.layout.gridview_layout, parent, false);
        holder.txt = (TextView) convertView.findViewById(R.id.txt);
        holder.flag = (ImageView) convertView.findViewById(R.id.flag);

        convertView.setTag(holder);
    }

    holder.txt.setText(result[position]);
    holder.flag.setImageResource(imageId[position]);

    convertView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, DetailActivity.class).putExtra(Intent.EXTRA_TEXT, result[position]);
            context.startActivity(intent);
        }
    });

    return convertView;
}

您还应该考虑使用ListView.setOnItemClickListener()而不是为列表中的每个项目创建新的OnClickListener