Android更新下载进度条

下载文件会阻塞UI主线程,所以需要new一个新线程来执行下载操作,通过handler执行更新UI进度条操作。代码如下:

public class AndroidTest extends Activity {
    private static final String TAG = "AndroidTest";

    private ProgressBar progressBar = null;
    private Button startButton = null;
    private EditText filenameText = null;
    private MyHandler handler = null;

    private Message message = null;
    private boolean flag = true;
    private int size = 1;
    private int hasRead = 0;
    private int len = 0;
    private byte buffer[] = new byte[1024*4];
    private int index = 0; 
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        progressBar = (ProgressBar)findViewById(R.id.progress_horizontal);
        startButton = (Button)findViewById(R.id.mybutton);
        startButton.setOnClickListener(new ButtonClick());
    
        filenameText = (EditText)findViewById(R.id.fileNameID);
    
        handler = new MyHandler();
    }


    public boolean downloadFile(final String urlStr, final String filename) {
        new Thread(new Runnable(){  
            public void run() { 
                try {
                    URL url = new URL(urlStr);
                    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                    size = connection.getContentLength();
                    InputStream inputStream = connection.getInputStream();
                    OutputStream outputStream = new FileOutputStream(Environment.getExternalStorageDirectory()+"/"+filename);
                    
                    while((len=inputStream.read(buffer))!=-1){
                        outputStream.write(buffer);
                        hasRead+=len;
                        index = (int)(hasRead*100)/size;
                        message = new Message();
                        message.what = 1;
                        handler.sendMessage(message);
                        Log.d(TAG, "index = " + index);
                        System.out.println("has = "+hasRead+" size = "+size+" index = "+index);
                    }
                
                    inputStream.close();
                    outputStream.close();
                } catch (Exception e) {
                    flag = false;
                    e.printStackTrace();
                }
            }
        }).start();
        
        return flag;
    }

    class ButtonClick implements OnClickListener {

        public void onClick(View v) {
    
            String url = filenameText.getText().toString();
            String filename = url.substring(url.lastIndexOf('/') + 1);
            Log.d(TAG, "url = " + url);
            Log.d(TAG, "filename = " + filename);
            
            if(!downloadFile(url, filename)) {
                String rs = "下载失败 ";
                Toast.makeText(AndroidTest.this, rs, Toast.LENGTH_SHORT).show();
            }
    
        }

    }

    class MyHandler extends Handler{

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                progressBar.setProgress(index);
                Log.d(TAG, "setProgress index:" + index);
                if (index >= 99) {
                    String rs = "下载完成";
                    Toast.makeText(AndroidTest.this, rs, Toast.LENGTH_SHORT).show();
                }
            }
            
            super.handleMessage(msg);
        }

    }

}

转:http://blog.csdn.net/ameyume/article/details/6183462

posted @ 2013-05-18 16:08  还是你最好  阅读(5100)  评论(0编辑  收藏  举报