当前位置: 首页 > 知识库问答 >
问题:

需要帮助下载文件使用java在我的应用程序,它尝试,但很快消失

刘星火
2023-03-14

我试图下载一个zip文件,并将其保存到SD卡。

我有一个id为“下载”的按钮

当我点击按钮时,对话框显示并迅速消失。

下面是代码部分的样子。

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;

public void download(View view) {
    switch (view.getId()) {
        case R.id.download:
            startDownload();
    }
}

private void startDownload() {
    String url = "https://mydownloadurl";
    new DownloadFileAsync().execute(url);
}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case DIALOG_DOWNLOAD_PROGRESS:
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Downloading file..");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
            return mProgressDialog;

        default:
            return null;
    }
}

class DownloadFileAsync extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... aurl) {
        int count;
        try {
            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();
            int lenghtOfFile = conexion.getContentLength();
            Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/mydownload.zip");
            byte data[] = new byte[1024];
            long total = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress("" + (int)((total * 100) / lenghtOfFile));
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
        }
        catch (Exception e) {
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("ANDRO_ASYNC",progress[0]);
        mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

日志中唯一显示的是

17586-17586/com.tyler.myappD/qdmemalloc: ion:映射缓冲基: 0x6da9b000大小: 1892352偏移: 0 fd:47 17586-17586/com.tyler.myappD/qdmemalloc: ion:映射缓冲基: 0x4002a000大小: 4096偏移: 0 fd:52 17586-17586/com.tyler.myappD/OpenGLRenader:冲洗缓存(模式0) 17586-17586/com.tyler.myappD/qdmemalloc: ion: Un映射缓冲库: 0x6da9b000大小:1892352 17586-17586/com.tyler.myappD/qdmemalloc: ion: Un映射缓冲库: 0x4002a000大小:4096 596-5470 /system_processW/InputMEDManagerService:窗口已经聚焦,忽略焦点增益:com.android.internal.view.IInputMEDClient$Stub$Proxy@42942fe8属性=null,令牌=android.os.BinderProxy@41dab9b0,pid=17586,inputType=0x(null)

共有1个答案

胡曾笑
2023-03-14

您的代码可能在doInbackground()中抛出异常。在你的捕捉块中,你应该记录异常,这样你就可以看到问题是什么。你可以这样做:

Log。e(“Downloader-doInBackground(),“下载时出错”,e)

另外,您是否在Android中指定了WRITE_EXTERNAL_STORAGE权限anifest.xml?

 类似资料:
  • /**程序可以将十进制转换为二进制并报告是否使用了非法字符*程序不能将二进制转换为十进制*/import java.util.scanner; /***这个类包含一个完整的程序,只有一个main()方法,用于*将非负十进制整数(即以10为基数的整数)转换为*正二进制整数(即以2为基数的整数)。要*转换的值是从命令行读入的。*/public class BaseConversions2{public

  • 我的java课有一个实验室。我拥有一切,除了不能得到正常工作的平均方法。每当我运行程序时,平均值都是从随机值中计算出来的,而不是更新的值。 程序测试 未排序的数组类(我之前忘记附加)

  • 很抱歉打扰你们,我是编程新手,一直在这个程序上有问题。 谢了! *********编辑***************我从BMI中删除了int值,但有损转换错误仍然存在。有什么办法解决这个问题吗?

  • 问题内容: 我从我的C#网络方法中以这种格式重新获得了JSON: 我现在有一个asp.net下拉列表。好吧,它呈现为带有id 的html下拉列表。 我收到有关AJAX请求的成功警报。如何将这些结果填充到我的#city下拉列表中? 试过这个: 问题答案: 以下是在回调内部应做的事情: 示例: http : //jsfiddle.net/z2D8f/ 或一次附加全部HTML的替代方法,这可能会更快:

  • 我正在尝试用Spray和Akka创建一个新的Scala项目。我正在使用Scala 2.12.1,我的pom如下所示。 这个pom构建了一个WAR文件,但是每次我试图将该WAR文件部署到服务器上时,都会得到以下错误。我相信我使用的依赖项与Scala 2.12.1是兼容的,你们能找出问题所在吗?

  • 有一个项目将涉及到sftp文件传输到服务器。我已经尝试使用ftp协议,并选择winscp.exe-sftp作为我的程序来录制。有事件被记录,但没有生成后,我完成了记录。 提前谢了。