我自己做了个文件下载的例子
然后我想加个进度条显示已下载多少
可是进度条只有在下载完成的时候才会显示满了再下载中一直是空的
还有就是当文件稍微大一点就算不出下载的百分比开始一直0%突然下完了就到100%了package a.a;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;public class a extends Activity {
    Button b;
    OutputStream output;// 输入出流
    ProgressBar bar;
    HandlerThread ht;
    myHandler h;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        b = (Button) findViewById(R.id.btn);
        bar = (ProgressBar) findViewById(R.id.bar);
        b.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // 创建URL 写入下载地址
                    URL url = new URL(
                            "http://e.zte.com.cn/pub/bbs/upload/2012/05/11/18688264685914.flv");
                    // 创建HttpURLConnection
                    HttpURLConnection urlcon = (HttpURLConnection) url
                            .openConnection();
                    // 获得文件大小
                    long TotalSize = Long.parseLong(urlcon
                            .getHeaderField("Content-Length"));
                    // 获得文件大小
                    int fileLength = urlcon.getContentLength();
                    // 获得输入流
                    InputStream is = urlcon.getInputStream();
                    // 创建目录
                    File dir = new File("/mnt/sdcard/abc");
                    dir.mkdir();
                    // 创建文件
                    File file = new File("/mnt/sdcard/abc/asd.flv");
                    // 如果存在则删除
                    if(file.exists())
                        file.delete();
                    // 创建文件
                    file.createNewFile();
                    // 创建文件输入流
                    output = new FileOutputStream(file);
                    byte buffer[] = new byte[4 * 1024];
                    int size = 0;
                    ht = new HandlerThread("down");
                    ht.start();
                    h = new myHandler(ht.getLooper());
                    bar.setVisibility(View.VISIBLE);
                    int aaa = fileLength / (1024 * 2);
                    while((is.read(buffer)) != -1) {
                        output.write(buffer);
                        size++;
                        Message m = h.obtainMessage();
                        m.arg1 = (size / aaa) * 100;
                        m.sendToTarget();
                    }
                    // 清除缓存
                    output.flush();
                }
                catch(Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                finally {
                    try {
                        // 关闭输出流
                        output.close();
                    }
                    catch(Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
    }    class myHandler extends Handler {
        public myHandler(Looper looper) {
            super(looper);
        }        boolean VISIBLE = false;        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            if(!VISIBLE) {
                bar.setVisibility(View.VISIBLE);
                VISIBLE = true;
            }
            bar.setProgress(msg.arg1);
        }
    }
}求高人讲解下 Handler ,HandlerThread,android UI线程和多线程

解决方案 »

  1.   

    想了解Handler,楼主可以参见这篇帖子。
    http://blog.csdn.net/hustpzb/article/details/6031525
      

  2.   


    package a.a;import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ProgressBar;public class a extends Activity {
        Button b;
        OutputStream output;// 输入出流
        ProgressBar bar;    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            b = (Button) findViewById(R.id.btn);
            bar = (ProgressBar) findViewById(R.id.bar);
            b.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    down();
                }
            });
        }    Handler handler = new Handler() {        @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                super.handleMessage(msg);
                switch(msg.what) {
                    case 0:
                        bar.setVisibility(View.VISIBLE);
                        break;
                    case 1:
                        bar.setProgress(msg.arg1);
                        break;
                }
            }
        };
    //下载方法 必须放在单独的线程里
        private void down() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Message m = handler.obtainMessage();
                        m.what = 0;
                        m.sendToTarget();
                        // 创建URL 写入下载地址
                        URL url = new URL(
                                "http://e.zte.com.cn/pub/bbs/upload/2012/05/11/18688264685914.flv");
                        // 创建HttpURLConnection
                        HttpURLConnection urlcon = (HttpURLConnection) url
                                .openConnection();
                        // 获得文件大小
                        long TotalSize = Long.parseLong(urlcon
                                .getHeaderField("Content-Length"));
                        // 获得文件大小
                        int fileLength = urlcon.getContentLength();
                        // 获得输入流
                        InputStream is = urlcon.getInputStream();
                        // 创建目录
                        File dir = new File("/mnt/sdcard/abc");
                        dir.mkdir();
                        // 创建文件
                        File file = new File("/mnt/sdcard/abc/asd.flv");
                        // 如果存在则删除
                        if(file.exists())
                            file.delete();
                        // 创建文件
                        file.createNewFile();
                        // 创建文件输入流
                        output = new FileOutputStream(file);
                        byte buffer[] = new byte[4 * 1024];
                        //已下载
                        int size = 0;
                        //把文件分为100份
                        int each = fileLength / 100;
                        while((is.read(buffer)) != -1) {
                            output.write(buffer);
                            Message m2 = handler.obtainMessage();
                            m2.what = 1;
                            size += 2 * 1024;
                            //提示已下载百分之多少
                            m2.arg1 = size / each;
                            m2.sendToTarget();
                        }
                        // 清除缓存
                        output.flush();
                    }
                    catch(Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    finally {
                        try {
                            // 关闭输出流
                            output.close();
                        }
                        catch(Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    }现在把代码改了
    能有进度条,但是下到50%~60%左右就不会动,不下了
    怎么回事?
      

  3.   

    http://www.eoeandroid.com/thread-70013-1-1.html参照一下