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

为什么应用程序崩溃时下载超过3g,但不是通过WiFi?

夹谷茂
2023-03-14

出于某种原因,每当用户在使用3g数据时单击下载按钮,屏幕就会完全变黑,应用程序就会请求强制关闭。

    private final String PATH = Environment.getExternalStorageDirectory() + "/folder";


    public void DownloadFromUrl(String fileName, String saveTo) {  
            try {
                    URL url = new URL("http://example.com/" + fileName + ".png");
                    File file = new File(fileName + ".png");

                    long startTime = System.currentTimeMillis();

                    URLConnection urlconnection = url.openConnection();




                    InputStream iS = urlconnection.getInputStream();
                    BufferedInputStream bis = new BufferedInputStream(iS);


                    ByteArrayBuffer baf = new ByteArrayBuffer(50);
                    int current = 0;
                    while ((current = bis.read()) != -1) {
                            baf.append((byte) current);
                    }


                    FileOutputStream fos = new FileOutputStream(PATH + saveTo);
                    fos.write(baf.toByteArray());
                    fos.close();
                    Toast t= Toast.makeText(getApplicationContext(), "Downloaded '" + saveTo + "' to '" + PATH + "'.", Toast.LENGTH_SHORT);
                    t.show();
            } catch (IOException e) {
                    Log.d("ImageManager", "Error: " + e);
            }

    }

共有2个答案

尹何平
2023-03-14

优秀的教程在这里:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

此外,从谷歌Androidapi中查看ASYNC,正如罗伯特建议的那样:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
陆文斌
2023-03-14

因为您正在用长时间运行的操作阻塞UI线程。

相反,可以尝试在后台线程、处理程序、服务、IntentService、AsyncTask或其他内容中发出请求,这样UI线程就不会卡住。

 类似资料:
  • 我刚刚在Google Play上构建并部署了一个应用程序。当我通过Android Studio运行它时,它运行得很好,但现在当我从Google Play下载它时,它崩溃了。因为这是我第一次,我甚至不知道如何查看从Google Play下载的应用程序的崩溃报告/堆栈跟踪。我感谢所有的帮助。 更新 所以我得到了APK的堆栈跟踪。它告诉我我的类无法创建我的类。我不知道为什么它会出现这个错误。一切正常。看

  • 我最近把一个应用程序上传到谷歌play商店,一切正常。我下载了它,并能够注册一个新用户。加载应用程序的主要活动时,应用程序崩溃。 这是我得到的stacktrace: 以前可能有人问过这个问题,但我已经研究了很多次,没有找到解决这个问题的方法。任何帮助都将不胜感激。该应用程序是使用android java和firebase创建的。

  • 我使用的是IntelliJIDEA CE edition(11.0.4)的最新版本。有一件事我在任何地方都找不到,它阻碍了我对Java/Spring的进一步改进。 控制器: 类:导入com.example.demo.interfaces.ISave; 类接口: 没什么特别的,只是为了掌握Spring和Java。 在我的控制器里,当我试图使用 我收到一个阻止应用启动的错误。以下是错误: 任务应用程序

  • 我尝试了太多东西,但每次按下“计算”(hesapla)按钮后,应用程序都会崩溃。 例如: 我应该写什么/做什么? 有一只原木猫; 通用域名格式。ertugrulguleryuzgmail。sdunothesaplama E/AndroidRuntime:致命异常:主java。lang.NumberFormatException:无效的int:“”在java上。整型。java上的invalidit(

  • 我在(unity)应用程序启动期间发生崩溃,只有从Play Store下载应用程序时才会出现。我进行了大量测试,即使在一个空的Unity项目中,我也观察到了这次崩溃。 我有谷歌游戏Firebase 如果我在安装后立即清除应用的存储,崩溃就会消失。 崩溃发生在Android9上,但不是在Android5.1上。如果我在google play控制台上使用不同的项目加载相同的应用程序,则不会发生崩溃(尝