1

何らかの理由で、ユーザーが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);
            }

    }
4

2 に答える 2

2

長時間実行される操作でUIスレッドをブロックしているためです。

代わりに、バックグラウンドスレッド、HandlerServiceIntentServiceAsyncTaskなどでリクエストを行ってみてください。そうすれば、UIスレッドがスタックしなくなります。

于 2012-11-30T03:52:59.143 に答える
2

ここでの優れたチュートリアル:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

また、 @ Robertがオプションとして提案したように、googleandroidapiから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");
     }
 }
于 2012-11-30T04:13:45.800 に答える