Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度

在开发过程中,总会需要从网络上下载文件,有时候还需要将下载进度显示在下拉菜单中。

现在写了一个Demo,封装了AsyncTask下载文件和进度显示的代码,以后在做项目的时候能够直接进行使用。

效果图:

主界面只有一个按钮,比较简单:

/ layout / activity_main.xml :

<RelativeLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent" ><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:text="点击下载" /></RelativeLayout>

MainActivity:其中的思路解释均在代码中:

import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Handler mHandler = new Handler();private AsyncTaskUtil mDownloadAsyncTask;private Button mButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mButton = (Button) findViewById(R.id.button);mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//AsyncTask异步下载任务mDownloadAsyncTask = new AsyncTaskUtil(MainActivity.this, mHandler);mDownloadAsyncTask.execute("", "Mobile Print.apk");//必须传入两个参数——参数1:url;参数2:文件名(可以为null)}});}}

以上只要通过新建一个AsyncTaskUtil的对象,传入url和文件名便能后台下载文件病显示下载进度,是不是很方面?具体的代码解析如下:

AsyncTaskRunnable:用于handler.post(Runnable)方法来更新UI,,下载进度主要通过NotificationManager、Notification和RemoteView来显示、更新下载的进度,不懂的同学需要google一下~

import java.text.DecimalFormat;import android.app.Notification;import android.app.NotificationManager;import android.content.Context;import android.util.Log;import android.widget.RemoteViews;import android.widget.Toast;public class AsyncTaskRunnable implements Runnable{public static final String TAG = "AsyncTaskRunnable";//主线程的activityprivate Context mContext;//notification的状态:更新 or 失败 or 成功private int mStatus;//notification的下载比例private float mSize;//管理下拉菜单的通知信息private NotificationManager mNotificationManager;//下拉菜单的通知信息private Notification mNotification;//下拉菜单的通知信息的viewprivate RemoteViews mRemoteViews;//下拉菜单的通知信息的种类idprivate static final int NOTIFICATION_ID = 1;//设置比例和数据public void setDatas(int status , float size) {this.mStatus = status;this.mSize = size;}//初始化public AsyncTaskRunnable(Context context) {this.mContext = context;mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);//初始化下拉菜单的通知信息mNotification = new Notification();mNotification.icon = R.drawable.ic_launcher;//设置下载进度的iconmNotification.tickerText = mContext.getResources().getString(R.string.app_name); //设置下载进度的titlemRemoteViews = new RemoteViews(mContext.getPackageName(), R.layout.down_notification);//对于RemoteView的使用,不懂的需要查找googlemRemoteViews.setImageViewResource(R.id.id_download_icon, R.drawable.ic_launcher);}@Overridepublic void run() {//通过判断不同的状态:更新中/下载失败/下载成功 更新下拉菜单的通知信息switch (mStatus) {case AsyncTaskUtil.NOTIFICATION_PROGRESS_FAILED://下载失败mNotificationManager.cancel(NOTIFICATION_ID);break;case AsyncTaskUtil.NOTIFICATION_PROGRESS_SUCCEED://下载成功mRemoteViews.setTextViewText(R.id.id_download_textview, "Download completed ! ");mRemoteViews.setProgressBar(R.id.id_download_progressbar, 100, 100, false);mNotification.contentView = mRemoteViews;mNotificationManager.notify(NOTIFICATION_ID, mNotification);mNotificationManager.cancel(NOTIFICATION_ID);Toast.makeText(mContext, "Download completed ! ", Toast.LENGTH_SHORT).show();break;case AsyncTaskUtil.NOTIFICATION_PROGRESS_UPDATE://更新中DecimalFormat format = new DecimalFormat("0.00");//数字格式转换String progress = format.format(mSize);Log.d(TAG, "the progress of the download " + progress);mRemoteViews.setTextViewText(R.id.id_download_textview, "Download completed : " + progress + " %");mRemoteViews.setProgressBar(R.id.id_download_progressbar, 100, (int)mSize, false);mNotification.contentView = mRemoteViews;mNotificationManager.notify(NOTIFICATION_ID, mNotification);break;}}}其中需要建立一个下载进度的布局文件,如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal"android:background="@android:color/white" ><ImageViewandroid:id="@+id/id_download_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="10dp"android:layout_marginLeft="10dp"android:src="@drawable/ic_launcher" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="10dip"android:layout_weight="1"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/app_name"android:textColor="@android:color/black"android:textSize="18dip"android:textStyle="bold" /><ProgressBarandroid:id="@+id/id_download_progressbar"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:max="100"android:progress="0"android:secondaryProgress="0" /><TextViewandroid:id="@+id/id_download_textview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Download completed : "android:textColor="@android:color/black"android:textSize="12dip"android:textStyle="bold" /></LinearLayout></LinearLayout></LinearLayout>

太过于近,彼此身上隐性的刺又会深深的伤害对方。

Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度

相关文章:

你感兴趣的文章:

标签云: