Android-下载侦听器或异步任务

Android-下载侦听器或异步任务,android,webview,android-asynctask,Android,Webview,Android Asynctask,我试图从网页上下载一些文件,通过点击网址,webview处理下载,而不是浏览器 如果我使用DownloadListener,它可以完美地解决一个问题,我看不到progressbar 如果我使用AsyncTask,我必须将url放在代码中才能下载它,我只需单击url并开始下载 我的问题是,如何让AsyncTask从web下载任何url而不必坐在 执行(“要下载的文件的url”) 或者如何为DownloadListener创建progressbar @覆盖 创建时的公共void(Bundle sa

我试图从网页上下载一些文件,通过点击网址,webview处理下载,而不是浏览器

如果我使用DownloadListener,它可以完美地解决一个问题,我看不到progressbar

如果我使用AsyncTask,我必须将url放在代码中才能下载它,我只需单击url并开始下载

我的问题是,如何让AsyncTask从web下载任何url而不必坐在

执行(“要下载的文件的url”)

或者如何为DownloadListener创建progressbar

@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview=(webview)findviewbyd(R.id.webview);
myProgressBar=(ProgressBar)findViewById(R.id.ProgressBar_水平);
新线程(myThread.start();
setWebViewClient(新的HelloWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.setInitialScale(50);
webview.getSettings().setUseWideViewPort(true);
webview.setVerticalScrollBarEnabled(false);
webview.setHorizontalScrollBarEnabled(false);
webview.loadUrl(“http://localhost/index.php");
setWebViewClient(新下载的WebViewClient());
setDownloadListener(新的DownloadListener(){
@凌驾
public void onDownloadStart(字符串url、字符串userAgent、,
字符串contentDisposition,字符串mimetype,
长(长){
输入流为;
试一试{
URL u=新的URL(URL);
HttpURLConnection con=(HttpURLConnection)u.openConnection();
con.setRequestMethod(“GET”);
con.设置输出(真);
con.connect();
is=con.getInputStream();
//下载APK的路径和文件
String path=Environment.getExternalStorageDirectory()+“/apdroid/”;
字符串文件名=url.substring(url.lastIndexOf('/')+1);
文件目录=新文件(路径);
dir.mkdirs();//如果不存在,则创建下载目录
文件输出文件=新文件(目录,文件名);
FileOutputStream fos=新的FileOutputStream(outputFile);
//将文件从URL保存到外部存储器上的下载目录
字节[]缓冲区=新字节[1024];
int len=0;
而((len=is.read(buffer))!=-1){
fos.写入(缓冲区,0,len);
}
fos.close();
is.close();
意向意向=新意向(意向.行动\视图);
String name=Environment.getExternalStorageDirectory()+“/apdroid/”+url.substring(url.lastIndexOf(“/”)+1);
setDataAndType(Uri.fromFile(新文件(名称)),“application/vnd.android.package archive”);
星触觉(意向);
}捕获(IOE异常){
e、 printStackTrace();
}
}
});
}
受保护的void安装(字符串文件名){
//TODO自动生成的方法存根
}
private Runnable myThread=new Runnable(){
@凌驾
公开募捐{
而(我的进度<100){
试一试{
myHandle.sendMessage(myHandle.obtainMessage());
睡眠(1000);
}捕获(可丢弃的t){
}
}
}
Handler myHandle=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
myProgress++;
myProgressBar.setProgress(myProgress);
}
};
};
私有类HelloWebViewClient扩展了WebViewClient{
@凌驾
public void onReceivedError(WebView视图、int错误代码、字符串描述、字符串失败URL){
请尝试{view.stopLoading();}捕获(异常e){}
尝试{view.clearView();}catch(异常e){}
view.loadUrl(“file:///android_asset/wifi.html");
}
}

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


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

您可能应该
覆盖URL加载
过程,并通过某种方式识别是否加载了您想要下载其资源的URL。

一旦检测到此问题,请停止加载页面并使用此URL启动AsyncTask。

很难从问题中提取您的需求…?如果我不够清楚,请原谅
@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");
}
    }