效果:
代码直接在上一篇AsyncTask示例中做修改,布局跟上次一样,这里不贴了。
MainActivity:
- package com.example.asynctaskdemo4;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- import android.app.Activity;
- import android.app.Notification;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.BitmapFactory.Options;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.support.v4.app.NotificationCompat;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.ProgressBar;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity implements OnClickListener
- {
- private static final String PATH = "http://h.hiphotos.baidu.com/image/w%3D2048/sign=d78504fa9d3df8dca63d8891f929738b/9f510fb30f2442a77e79f7a8d343ad4bd1130243.jpg";
- private Button but_down = null;
- private ImageView iv_show = null;
- private TextView tv_progress = null;
- private ProgressBar pb = null;
- private NotificationManager manager = null;
- private NotificationCompat.Builder builder;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- but_down = (Button) findViewById(R.id.but_down);
- iv_show = (ImageView) findViewById(R.id.iv_show);
- tv_progress = (TextView) findViewById(R.id.tv_progress);
- pb = (ProgressBar) findViewById(R.id.pb);
- manager = (NotificationManager) MainActivity.this.getSystemService(NOTIFICATION_SERVICE);
- but_down.setOnClickListener(this);
- }
- @Override
- public void onClick(View v)
- {
- if (R.id.but_down == v.getId())
- {
- new DownloadImageTask().execute(PATH);
- }
- }
- private class DownloadImageTask extends AsyncTask<String, Integer, Bitmap>
- {
- @Override
- protected void onPostExecute(Bitmap result)
- {
- if (result != null)
- {
- tv_progress.setVisibility(View.GONE);
- pb.setVisibility(View.GONE);
- iv_show.setImageBitmap(result);
- builder.setProgress(0,0,true);
- builder.setContentText("下载完成");
- Notification no = builder.build();
- no.flags = Notification.FLAG_AUTO_CANCEL;
- no.defaults = Notification.DEFAULT_SOUND;
- manager.notify(1, no);
- } else
- {
- builder.setProgress(0, 0, true);
- builder.setContentText("下载失败..");
- manager.notify(1,builder.build());
- tv_progress.setVisibility(View.GONE);
- pb.setVisibility(View.GONE);
- Toast.makeText(MainActivity.this,"下载失败",0).show();
- }
- }
- @Override
- protected Bitmap doInBackground(String... params)
- {
- String path = params[0];
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(path);
- try
- {
- HttpResponse resp = client.execute(get);
- if(resp.getStatusLine().getStatusCode() == 200)
- {
- HttpEntity entity = resp.getEntity();
- if(entity == null)
- {
- return null;
- }
- long total_length = entity.getContentLength();//获取文件总长
- InputStream is = entity.getContent();
- ByteArrayOutputStream bous = new ByteArrayOutputStream();
- int len = 0;
- byte[] buf = new byte[1024];
- int current_len = 0;
- int progress = 0;//当前下载进度
- while((len = is.read(buf))!= -1)
- {
- current_len+=len;
- bous.write(buf, 0, len);
- progress = (int) ((current_len/(float)total_length)*100);
- this.publishProgress(progress);
- }
- is.close();
- byte[] data = bous.toByteArray();
- Options opts = new Options();
- opts.inSampleSize = 2;//简单起见直接指定缩放比例
- Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
- return bitmap;
- }
- } catch (Exception e)
- {
- e.printStackTrace();
- }
- return null;
- }
- @Override
- protected void onProgressUpdate(Integer... values)
- {
- tv_progress.setText("下载进度:"+values[0]);
- builder.setContentText("下载进度:"+values[0]+"%");
- builder.setProgress(100, values[0], false);
- Notification no = builder.build();
- no.flags = Notification.FLAG_NO_CLEAR;
- manager.notify(1,no);
- no = null;
- }
- @Override
- protected void onPreExecute()
- {
- tv_progress.setVisibility(View.VISIBLE);
- pb.setVisibility(View.VISIBLE);
- builder = new NotificationCompat.Builder(MainActivity.this);
- builder.setSmallIcon(R.drawable.down);
- builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.down));
- builder.setContentTitle("美女图片");
- PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, new Intent(MainActivity.this,MainActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);
- builder.setContentIntent(pi);
- builder.setProgress(100, 0, false);
- manager.notify(1,builder.build());
- }
- }
- }
这里使用的是v4包的
NotificationCompat.Builder类来产生Notification实例,如果你直接new一个Notification,那应该自定义一个Notification样式,即在通知中加一个ProgressBar。
像这样:
- Notification no = new Notification(icon, tickerText, when);
- no.contentView.setProgressBar(viewId, max, progress, indeterminate);