android 사용자 정의Dialog 파일 다운로드 및 다운로드 진행

12147 단어
최근에 업데이트 검사 기능을 실현하려고 합니다. 프로그램에 들어갈 때 서버를 요청하고 서버의 응답 업데이트 결과를 받습니다!업데이트가 필요하면 Dialog를 열고 Dialog에서 파일을 다운로드한다. 그래서 스스로 사용자 정의 dialog의 실현을 연구했고 dialog에 진도가 있는 다운로드 파일(자신의 작도 기술 조사, 배경을 마음대로 그렸다)도 완성했다. 효과도는 다음과 같다.
 
 
효과가 위와 같으니 다음은 내가 코드를 붙여 놓을게.
메인 인터페이스Activity: 메인 인터페이스에 Button이 정의되어 있습니다. Button을 누르면 Dialog가 팝업됩니다.
package com.spring.sky.dialog.download;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

/**
 *    
 * @author spring sky
 */
public class MainActivity extends Activity implements
		android.view.View.OnClickListener {
	private Button bt;
	private ImageView imageView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init() {
		bt = (Button) this.findViewById(R.id.bt);
		bt.setOnClickListener(this);
		imageView = (ImageView) findViewById(R.id.imageview);
	}

	@Override
	public void onClick(View v) {
		DownloadDialog dialog = new DownloadDialog(this,
				"http://img308.ph.126.net/AM2zg9CNx0kG8K3jY122RQ==/3902932027070067384.jpg");
		dialog.setImageView(imageView);  //          ,       ,           
		dialog.show();
	}
}

main.xml:



    

        


自定义的Dialog  :  这个基本就是实现Dialog的布局,还有Dialog的背景透明效果,然后用户点击了下载,启动一个新线程下载,同时用handler来发送消息,让下载操作的进度在Dialog的view上面呈现出来,当下载完成的时候,点击按钮就可以看见下载的图片了!  (我测试为了简单就用了一个ImageView把图片显示出来)

package com.spring.sky.dialog.download;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;


import android.app.Dialog;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/***
 * dialog    
 * @author spring sky 
* QQ :840950105 */ public class DownloadDialog extends Dialog implements android.view.View.OnClickListener { private static final int DOWNLOAD_PREPARE = 0; private static final int DOWNLOAD_WORK = 1; private static final int DOWNLOAD_OK = 2; private static final int DOWNLOAD_ERROR = 3; private static final String TAG = "IndexActivity"; private Context mContext; private Button bt; private ProgressBar pb; /** */ private boolean isClick = false; private boolean downloadOk = false; private TextView tv; /** * url */ private String url = null; private String filePath; /** * */ int fileSize = 0; /** * */ int downloadSize = 0; /** * handler */ private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case DOWNLOAD_PREPARE: Toast.makeText(mContext, " ", Toast.LENGTH_SHORT).show(); pb.setVisibility(ProgressBar.VISIBLE); Log.e(TAG, " :" + fileSize); pb.setMax(fileSize); break; case DOWNLOAD_WORK: Log.e(TAG, " :" + downloadSize); pb.setProgress(downloadSize); int res = downloadSize * 100 / fileSize; tv.setText(" :" + res + "%"); bt.setText(FileUtil.FormetFileSize(downloadSize) + "/" + FileUtil.FormetFileSize(fileSize)); break; case DOWNLOAD_OK: downloadOk = true; bt.setText(" "); downloadSize = 0; fileSize = 0; Toast.makeText(mContext, " ", Toast.LENGTH_SHORT).show(); break; case DOWNLOAD_ERROR: downloadSize = 0; fileSize = 0; Toast.makeText(mContext, " ", Toast.LENGTH_SHORT).show(); break; } super.handleMessage(msg); } }; private ImageView imageView; public DownloadDialog(Context context, String url) { super(context, R.style.Theme_CustomDialog); mContext = context; this.url = url; filePath = FileUtil.getPath(mContext, url); } @Override public void cancel() { super.cancel(); } /** * */ private void downloadFile() { try { URL u = new URL(url); URLConnection conn = u.openConnection(); InputStream is = conn.getInputStream(); fileSize = conn.getContentLength(); if (fileSize < 1 || is == null) { sendMessage(DOWNLOAD_ERROR); } else { sendMessage(DOWNLOAD_PREPARE); FileOutputStream fos = new FileOutputStream(filePath); byte[] bytes = new byte[1024]; int len = -1; while ((len = is.read(bytes)) != -1) { fos.write(bytes, 0, len); fos.flush(); downloadSize += len; sendMessage(DOWNLOAD_WORK); } sendMessage(DOWNLOAD_OK); is.close(); fos.close(); } } catch (Exception e) { sendMessage(DOWNLOAD_ERROR); e.printStackTrace(); } } /*** * * * @return */ public String getFilePath() { return filePath; } private void init() { bt = (Button) this.findViewById(R.id.down_bt); bt.setOnClickListener(this); tv = (TextView) this.findViewById(R.id.down_tv); pb = (ProgressBar) this.findViewById(R.id.down_pb); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.down_bt: if (isClick) { // Thread thread = new Thread(new Runnable() { @Override public void run() { downloadFile(); } }); thread.start(); isClick = false; } if (downloadOk) // , ImageView { imageView.setImageBitmap(BitmapFactory.decodeFile(filePath)); cancel(); } break; default: break; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.download_layuot); init(); } /** * @param what */ private void sendMessage(int what) { Message m = new Message(); m.what = what; handler.sendMessage(m); } public void setImageView(ImageView imageView) { this.imageView = imageView; } @Override public void show() { isClick = true; downloadOk = false; super.show(); } }

dialog의downloadlayuot.xml 레이아웃 파일: 이것은 상대적인 레이아웃을 사용하여ProgressBar와TextView를 한 가운데에 보여줍니다. 마치 연결된 것처럼 보입니다.동시에 Button을 사용하여 파일 크기 표시


	
	
	
	     
	     
	
        


在dialog中需要一个样式,这个样式可以实现Dialog后面的背景透明:




    
    
    
    


 
FileUtil이 하나 더 있습니다.java의 파일 도구 클래스:
package com.spring.sky.dialog.download;

import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.DecimalFormat;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

/**
 *      
 * @author spring sky
 *
 */
public class FileUtil {
	/**
	 *       
	 * @param url
	 * @return FileName
	 */
	public static String getFileName(String url)
	{
		int lastIndexStart = url.lastIndexOf("/");
		if(lastIndexStart!=-1)
		{
			return url.substring(lastIndexStart+1, url.length());
		}else{
			return new Timestamp(System.currentTimeMillis()).toString();
		}
	}
	/**
	 *   SD     
	 * @return boolean
	 */
	public static boolean checkSDCard() {
		if (android.os.Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED)) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 *          
	 * @param context
	 * @return         
	 */
	public static String setMkdir(Context context)
	{
		String filePath = null;
		if(checkSDCard())
		{
			filePath = Environment.getExternalStorageDirectory()+File.separator+"yishuabao"+File.separator+"downloads";
		}else{
			filePath = context.getCacheDir().getAbsolutePath()+File.separator+"yishuabao"+File.separator+"downloads";
		}
		File file = new File(filePath);
		if(!file.exists())
		{
			file.mkdirs();
			Log.e("file", "                ");
		}else{
			Log.e("file", "    ");
		}
		return filePath;
	}
	
	/**
	 *     
	 * @return
	 * @throws IOException
	 */
	public static  String getPath(Context context,String url)
	{
		String path = null;
		try {
			path = FileUtil.setMkdir(context)+File.separator+url.substring(url.lastIndexOf("/")+1);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return path;
	}
	
	/**
	 *        
	 * 
	 * @param fileSize
	 *                 
	 * @return
	 */
	public static String FormetFileSize(int fileSize) {//       
		DecimalFormat df = new DecimalFormat("#.00");
		String fileSizeString = "";
		if (fileSize < 1024) {
			fileSizeString = df.format((double) fileSize) + "B";
		} else if (fileSize < 1048576) {
			fileSizeString = df.format((double) fileSize / 1024) + "K";
		} else if (fileSize < 1073741824) {
			fileSizeString = df.format((double) fileSize / 1048576) + "M";
		} else {
			fileSizeString = df.format((double) fileSize / 1073741824) + "G";
		}
		return fileSizeString;
	}
	
}

상기 코드 논리는 간단할 수 있습니다. 주로 다이어로그의 레이아웃 효과를 알아야 합니다!Handler를 사용하여 다운로드 진행 상황을 동적으로 표시합니다!여러분에게 공유하고 여러분과 함께 공부합시다!문의 사항은
Author:   spring sky  
Email:   [email protected]
QQ   : 840950105  
 
복사가 번거롭지 않도록 원본 코드도 공유해 주세요. 주소:http://download.csdn.net/detail/vipa1888/4224438
 
 
 
 
전재 대상:https://www.cnblogs.com/springskyhome/archive/2012/04/13/3689932.html

좋은 웹페이지 즐겨찾기