Android - DownloadListener或AsyncTask

时间:2011-07-29 08:45:42

标签: android webview android-asynctask

我试图通过使用webview处理下载而不是浏览器的网址来下载网页上的某些文件

如果我使用DownloadListener,它可以很好地解决一个我无法看到进度条的问题

如果我使用AsyncTask我必须将url放入代码中下载它我只需点击网址并开始下载

我的问题是如何让AsyncTask从网上下载任何网址而不必坐下

downloadFile.execute(“您要下载的文件的网址”);

或如何为DownloadListener创建进度条

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    webview = (WebView) findViewById(R.id.webview);
    myProgressBar = (ProgressBar) findViewById(R.id.progressbar_Horizontal);
    new Thread(myThread).start();
    webview.setWebViewClient(new HelloWebViewClient());
    webview.getSettings().setJavaScriptEnabled(true);
    webview.setInitialScale(50); 
    webview.getSettings().setUseWideViewPort(true); 
    webview.setVerticalScrollBarEnabled(false);
    webview.setHorizontalScrollBarEnabled(false);
    webview.loadUrl("http://localhost/index.php");
    webview.setWebViewClient(new DownloadWebViewClient());
    webview.setDownloadListener(new DownloadListener() {

       @Override
       public void onDownloadStart(String url, String userAgent,
             String contentDisposition, String mimetype,
             long contentLength) {
           InputStream is;
           try {
               URL u = new URL(url);
               HttpURLConnection con = (HttpURLConnection) u.openConnection();
               con.setRequestMethod("GET");
               con.setDoOutput(true);
               con.connect();
               is = con.getInputStream();


           // Path and File where to download the APK
           String path = Environment.getExternalStorageDirectory() + "/apdroid/";
           String fileName = url.substring(url.lastIndexOf('/') + 1);
           File dir = new File(path);
           dir.mkdirs(); // creates the download directory if not exist
           File outputFile = new File(dir, fileName);
           FileOutputStream fos = new FileOutputStream(outputFile);

           // Save file from URL to download directory on external storage
           byte[] buffer = new byte[1024];
           int len = 0;
           while ((len = is.read(buffer)) != -1) {
               fos.write(buffer, 0, len);
           }
           fos.close();
           is.close();


           Intent intent = new Intent(Intent.ACTION_VIEW);
           String name = Environment.getExternalStorageDirectory() + "/apdroid/" + url.substring(url.lastIndexOf('/') + 1);
           intent.setDataAndType(Uri.fromFile(new File(name)), "application/vnd.android.package-archive");
           startActivity(intent);


       }catch (IOException e) {
           e.printStackTrace();
        }
       }
    });


 }



protected void install(String fileName) {
    // TODO Auto-generated method stub

}



private Runnable myThread = new Runnable() {

    @Override
    public void run() {
       while (myProgress < 100) {
          try {
             myHandle.sendMessage(myHandle.obtainMessage());
             Thread.sleep(1000);
          } catch (Throwable t) {
          }
       }
    }

    Handler myHandle = new Handler() {

       @Override
       public void handleMessage(Message msg) {
          myProgress++;
          myProgressBar.setProgress(myProgress);
       }

    };

 };









private class HelloWebViewClient extends WebViewClient {










@Override
public void onReceivedError(WebView view,int errorCode,String description,String failingUrl) {
   try {view.stopLoading();} catch(Exception e){}
   try {view.clearView();} catch(Exception e){}
   view.loadUrl("file:///android_asset/wifi.html");
}
    }

当我从我的页面下载任何文件时,我只想拥有ProgressBar

我无法使用asyncTask因为我必须将文件放在代码中而不是通过点击它们

1 个答案:

答案 0 :(得分:0)

您可能应该overriding the URL loading进程,并通过某种方式识别是否正在加载您想要下载其资源的URL。
一旦检测到这种情况,请立即停止加载页面并使用此URL启动AsyncTask。