android开发 - AsyncTask

来源:互联网 发布:linux 重启服务器命令 编辑:程序博客网 时间:2024/06/03 18:56
一般我们加载完数据,给做下缓存,最好了






ListView分页


主布局


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


    <ListView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listview"/>


</RelativeLayout>


item布局


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#f00"
        android:id="@+id/textview"/>


</LinearLayout>


页脚加载显示布局


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <ProgressBar 
        android:id="@+id/progressbar"
        android:layout_width="50dp" 
        android:layout_height="50dp"
        style="?android:attr/progressBarStyle"
        />
    
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="正在加载。。。" />


</LinearLayout>




java代码






public class MainActivity extends Activity {
private ListView listView;
private List<String> data;
private ArrayAdapter<String> adapter;
private View footView;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


listView = (ListView) this.findViewById(R.id.listview);
data = new ArrayList<String>();
listView.setOnScrollListener(new MyListView());
data.addAll(DataService.getData(0, 30));
adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.textview,
data);
footView = getLayoutInflater().inflate(R.layout.footerloading, null);

listView.addFooterView(footView);
listView.setAdapter(adapter); 
listView.removeFooterView(footView);
}


private int number = 30;
private int maxpage = 5;
private boolean finish = true;


private final class MyListView implements OnScrollListener {


@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i("MainActivity", "onScrollStateChanged()");
}


@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {


final int total = totalItemCount;
// 取到ListView的最后一条数据的索引
int lastItemId = listView.getLastVisiblePosition();
if ((lastItemId + 1) == totalItemCount) {
// 取当前页码
int currentPage = totalItemCount % number == 0 ? totalItemCount
/ number : totalItemCount / number + 1;
// 下一页
int nextpage = currentPage + 1;
if (nextpage <= maxpage && finish) {
listView.addFooterView(footView);
finish = false;
new Thread(new Runnable() {
public void run() {
List<String> list = DataService.getData(total,
number); 
handler.sendMessage(handler.obtainMessage(100,list));
}
}).start();
}
}
}


Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
data.addAll((List<String>) msg.obj);
adapter.notifyDataSetChanged();// 告诉listView数据已经发生改变,要求ListView更新界面
if(listView.getFooterViewsCount() > 0){ 
listView.removeFooterView(footView);
}
finish = true;
};
};
}


}













 使用AsyncTask 异步任务


异步任务优点:就是新起来一个线程,执行过程中不会阻塞UI线程




异步任务就是开辟了一个新的线程,去执行一个不阻塞UI线程的操作








注意:
1. 在UI线程中,直接操作是不允许访问网络的
2. 允许访问网络,使用AsyncTask








异步任务执行步骤


1. onPreExecute()


2. doInBackground(Params...)


3. onProgressUpdate(Progress...)


4. onPostExecute(Result);












使用异步任务的规则:
1. 声明一个类继承AsyncTask 标注三个参数的类型
2. 第一个参数表示要执行的任务,通常是网络的路径,
   第二个参数表示进度的刻度
   第三个参数表示任务执行的返回结果




下载一张图片的代码如   非阻塞式的:


1. 申请联网授权:
   <uses-permission android:name="android.permission.INTERNET" />


2. java代码
   public class MainActivity extends Activity {
private ImageView iview;
private ProgressDialog progressDialog;
private String Path = "http://pic.58pic.com/58pic/17/13/57/27Y58PICFHf_1024.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        iview = (ImageView)this.findViewById(R.id.imageView1);
        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("提示信息");
        progressDialog.setMessage("正在下载,下载中......");
    }
    
    //下载图片点击事件
    public void downloadImage(View v){ 
    new MyTask().execute(Path);
    } 
    
    //异步执行任务,内部实现也是开启了一个新的线程
    public class MyTask extends AsyncTask<String,Void,Bitmap>{ 
    //表示任务执行之前的操作
    @Override
    protected void onPreExecute() { 
    super.onPreExecute();
    progressDialog.show();
    }
   
    //主要是完成耗时的操作
@Override
protected Bitmap doInBackground(String... params) {
//这里就是下载图片,使用HttpClient类,网络数据的提取
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
try {
HttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity(); 
byte[] bytes = EntityUtils.toByteArray(entity);
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
}
} catch (Exception e) {  
e.printStackTrace();
}
return bitmap;
}

//主要是更新UI的操作
@Override
protected void onPostExecute(Bitmap result) { 
super.onPostExecute(result);
iview.setImageBitmap(result);
progressDialog.dismiss();

    } 
}
























下载图片代码:    
阻塞式弹出进度条,并且是真正的计算进度条




public class MainActivity extends Activity {
private String path = "http://img3.3lian.com/2013/c4/103/d/8.jpg";
private ProgressDialog dialog;
private ImageView iView;

@Override
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

dialog = new ProgressDialog(this);
dialog.setTitle("系统提示");
dialog.setMessage("正在loading......");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);

iView = (ImageView) this.findViewById(R.id.imageView1);
}

public void downloadImage(View v){
new MyTask().execute(path);
}
 
private class MyTask extends AsyncTask<String,Integer,Bitmap>{
@Override
protected void onPreExecute() { 
super.onPreExecute();
dialog.show();
}

   @Override
   protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 
    dialog.setProgress(values[0]);
   }

   @Override
protected Bitmap doInBackground(String... arg0) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(arg0[0]);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    InputStream inputStream = null;
    Bitmap bitmap = null;
    try {
HttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
inputStream = response.getEntity().getContent();
long file_len = response.getEntity().getContentLength();
int len=0;
byte[] buffer = new byte[1024];
int total_length = 0;
while((len = inputStream.read(buffer)) != -1){
total_length += len;
int value = (int)((total_length / (float)file_len) * 100);
publishProgress(value);
outputStream.write(buffer,0,len);
}
byte[] tempOutputStream = outputStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(tempOutputStream, 0, tempOutputStream.length);
}

} catch (Exception e) { 
e.printStackTrace(); 
}
//     finally{ 
//     if(outputStream != null){
//     try {
// outputStream.close();
// } catch (IOException e) { 
// e.printStackTrace();
// }
//     }
//     if(inputStream != null){
//     try {
// inputStream.close();
// } catch (IOException e) { 
// e.printStackTrace();
// }
//     }
//     }
   
return bitmap;

   @Override
   protected void onPostExecute(Bitmap result) { 
    super.onPostExecute(result);
    iView.setImageBitmap(result);
    dialog.dismiss();
   }
}


}

































































































































































0 0