使用AsyncTask<Void,Void,Void>实现加载大量图片时
new GetGridDataTask().execute(null)报错:The method execute(Void[]) is ambiguous for the type MainActivity.GetGridDataTask
我sdk版本是4.4 但是我把sdk换成2.3.3版本是ok的,所以google在3.0以后对AsyncTask做了修改,解决也非常简单,直接在
execute()方法中什么都不写就ok了
改成:new GetGridDataTask().execute();//执行获取数据的任务 就可以了
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">使用GridView模拟异步加载大量图片:</span>
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">AsyncTask可能存在新开大量线程消耗系统资源和导致应用FC的风险</span>
</span>
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">package com.app.fantasticbaby;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
private GridView asyn_gridview;
private List<HashMap<String,Object>> mDatas;
private CustomAdapter adapter;
private static final int DIALOG_PROGRESS = 0;
private ProgressDialog mProgressDialog;
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>protected void onCreate(Bundle savedInstanceState) {
<span style="white-space:pre"> </span>super.onCreate(savedInstanceState);
<span style="white-space:pre"> </span>setContentView(R.layout.activity_main);
<span style="white-space:pre"> </span>asyn_gridview = (GridView)findViewById(R.id.asyn_gridview);
<span style="white-space:pre"> </span>mDatas = new ArrayList<HashMap<String,Object>>();
<span style="white-space:pre"> </span>adapter = new CustomAdapter();
<span style="white-space:pre"> </span>asyn_gridview.setAdapter(adapter);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span> @Override
<span style="white-space:pre"> </span>protected void onStart () {
<span style="white-space:pre"> </span>Log.i("onstart", "onstart");
super.onStart();
new GetGridDataTask().execute();//执行获取数据的任务
}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> @Override
<span style="white-space:pre"> </span> protected Dialog onCreateDialog(int id) {
<span style="white-space:pre"> </span> switch (id) {
<span style="white-space:pre"> </span> case DIALOG_PROGRESS:
<span style="white-space:pre"> </span> mProgressDialog = new ProgressDialog(MainActivity.this);
<span style="white-space:pre"> </span> mProgressDialog.setMessage("正在获取数据");
<span style="white-space:pre"> </span> mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> return mProgressDialog;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> return null;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public boolean onCreateOptionsMenu(Menu menu) {
<span style="white-space:pre"> </span>// Inflate the menu; this adds items to the action bar if it is present.
<span style="white-space:pre"> </span>getMenuInflater().inflate(R.menu.main, menu);
<span style="white-space:pre"> </span>return true;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>class CustomAdapter extends BaseAdapter{
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public int getCount() {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>return mDatas.size();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public Object getItem(int arg0) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>return mDatas.get(arg0);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public long getItemId(int arg0) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>return arg0;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public View getView(int position, View convertView, ViewGroup parent) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>ViewHolder holder = null;
<span style="white-space:pre"> </span>if(convertView == null){
<span style="white-space:pre"> </span>convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.grid_item, null);
<span style="white-space:pre"> </span>holder = new ViewHolder();
<span style="white-space:pre"> </span>holder.item_image = (ImageView)convertView.findViewById(R.id.item_image);
<span style="white-space:pre"> </span>holder.item_text = (TextView)convertView.findViewById(R.id.item_text);
<span style="white-space:pre"> </span>convertView.setTag(holder);
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>holder = (ViewHolder) convertView.getTag();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>holder.item_text.setText((String)(mDatas.get(position).get("title")));
<span style="white-space:pre"> </span> Integer id = (Integer) mDatas.get(position).get("pic");
<span style="white-space:pre"> </span> if(id != null) {
<span style="white-space:pre"> </span> holder.item_image.setImageResource(id);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> else {
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>holder.item_image.setImageBitmap(null);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> AsyncTask task = (AsyncTask) mDatas.get(position).get("task");
<span style="white-space:pre"> </span> if(task == null || task.isCancelled()) {
<span style="white-space:pre"> </span> Log.d("Test", "" + position);
<span style="white-space:pre"> </span> mDatas.get(position).put("task", new GetItemImageTask(position).execute());//执行获取图片的任务
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>return convertView;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>class ViewHolder{
<span style="white-space:pre"> </span>ImageView item_image;
<span style="white-space:pre"> </span>TextView item_text;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>class GetGridDataTask extends AsyncTask<Void,Void,Void>{
<span style="white-space:pre"> </span>protected void onPreExecute () {
mDatas.clear();
adapter.notifyDataSetChanged();
showDialog(DIALOG_PROGRESS);//打开等待对话框
}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>protected Void doInBackground(Void... params) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>Thread.sleep(500);//模拟耗时的网络操作
<span style="white-space:pre"> </span>} catch (InterruptedException e) {
<span style="white-space:pre"> </span>// TODO Auto-generated catch block
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span> for(int i = 0; i < 200; i++) {
<span style="white-space:pre"> </span> HashMap<String, Object> hm = new HashMap<String, Object>();
<span style="white-space:pre"> </span> hm.put("title", "Title");
<span style="white-space:pre"> </span> mDatas.add(hm);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>return null;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>protected void onPostExecute (Void result) {
adapter.notifyDataSetChanged();//通知ui界面更新
dismissDialog(DIALOG_PROGRESS);//关闭等待对话框
}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>class GetItemImageTask extends AsyncTask<Void,Void,Void>{
<span style="white-space:pre"> </span>int pos;
GetItemImageTask(int pos) {
this.pos = pos;
}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>protected Void doInBackground(Void... arg0) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>Thread.sleep(2000);//模拟耗时的网络操作
<span style="white-space:pre"> </span>} catch (InterruptedException e) {
<span style="white-space:pre"> </span>// TODO Auto-generated catch block
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>mDatas.get(pos).put("pic", R.drawable.back1);
<span style="white-space:pre"> </span>return null;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>protected void onPostExecute(Void result) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span> adapter.notifyDataSetChanged();//通知ui界面更新
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
}
</span>
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">
</span>
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">
</span>
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">
</span>