2012-10-23 126 views
-2

我試圖從服務器下載zip文件。對於我使用下面的代碼:使用Android下載ZIP文件

 String path = Environment.getExternalStorageDirectory().toString() + "/KaLePro/"; 
     StartscreenModel sm = StartscreenModel.getInstance(); 
     //TODO FIX: unkown error! Bring usb-cable to find out! 
     try { 
      URL url = new URL(urlString); 
      System.out.println("Connecting to " + url); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("GET"); 
      connection.setDoOutput(true); 
      connection.connect(); 
      int fileLength = connection.getContentLength(); 

      File PATH = new File(path + "import/"); 
      if (!PATH.exists()) { 
       PATH.mkdirs(); 
      } 

      File outputFile = new File(PATH, "tmp.zip"); 

      InputStream input = connection.getInputStream(); 
      OutputStream output = new FileOutputStream(outputFile); 

      byte data[] = new byte[1024]; 
      long total = 0; 
      int count; 
      sm.setSubMax(100); 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       sm.setSubStep((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
      Toast.makeText(Booklist.this, "Download fertig.", Toast.LENGTH_SHORT).show(); 
     } catch (MalformedURLException e) { 
      Toast.makeText(Booklist.this, "Keine gültige URL", Toast.LENGTH_SHORT).show(); 
     } catch (IOException e) { 
      Toast.makeText(Booklist.this, "Keine Verbindung zur URL", Toast.LENGTH_SHORT).show(); 
     } 

但是,當我嘗試下載我收到以下錯誤logcat中的文件:

10-23 10:22:37.867: E/AndroidRuntime(21490): FATAL EXCEPTION: main 
10-23 10:22:37.867: E/AndroidRuntime(21490): android.os.NetworkOnMainThreadException 
10-23 10:22:37.867: E/AndroidRuntime(21490): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.io.IoBridge.connect(IoBridge.java:112) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at java.net.Socket.connect(Socket.java:842) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at de.isogon.kalepro.activities.Booklist$2.onDownload(Booklist.java:194) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at de.isogon.kalepro.views.dialogs.DialogDownload$2.onClick(DialogDownload.java:76) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at android.view.View.performClick(View.java:4211) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at android.view.View$PerformClick.run(View.java:17267) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at android.os.Handler.handleCallback(Handler.java:615) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at android.os.Looper.loop(Looper.java:137) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at android.app.ActivityThread.main(ActivityThread.java:4898) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at java.lang.reflect.Method.invokeNative(Native Method) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at java.lang.reflect.Method.invoke(Method.java:511) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
10-23 10:22:37.867: E/AndroidRuntime(21490): at dalvik.system.NativeStart.main(Native Method) 

凡de.isogon.kalepro.activities.Booklist $ 2 .onDownload(Booklist.java:194)鏈接到connection.connect();上面的代碼。

我的清單權限如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.GET_TASKS"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

我已經testet大量的下載代碼示例已經 - 一切似乎都產生幾乎同樣的錯誤。

+0

可能重複(http://stackoverflow.com/questions/5150637/networkonmainthreadexception) –

+1

不網絡上主線程。使用AsyncTask –

回答

2

作品你可以從你的logcat看到:10-23 10:22:37.867: E/AndroidRuntime(21490): android.os.NetworkOnMainThreadException

的原因不能正常工作的,因爲你正在使用這個UI線程。嘗試將下載文件添加到在單獨的線程上運行的AsyncTask ir。

0

我有了這個類

public class ZipUtility { 
    public static final void zipDirectory(File directory, File zip) 
      throws IOException { 
     ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip)); 
     zip(directory, directory, zos); 
     zos.close(); 
    } 

    private static final void zip(File directory, File base, ZipOutputStream zos) 
      throws IOException { 
     File[] files = directory.listFiles(); 
     byte[] buffer = new byte[8192]; 
     int read = 0; 
     for (int i = 0, n = files.length; i < n; i++) { 
      if (files[i].isDirectory()) { 
       zip(files[i], base, zos); 
      } else { 
       FileInputStream in = new FileInputStream(files[i]); 
       ZipEntry entry = new ZipEntry(files[i].getPath().substring(
         base.getPath().length() + 1)); 
       zos.putNextEntry(entry); 
       while (-1 != (read = in.read(buffer))) { 
        zos.write(buffer, 0, read); 
       } 
       in.close(); 
      } 
     } 
    } 

    public static final void unzip(File zip, File extractTo) throws IOException { 
     ZipFile archive = new ZipFile(zip); 
     Enumeration e = archive.entries(); 
     while (e.hasMoreElements()) { 
      ZipEntry entry = (ZipEntry) e.nextElement(); 
      File file = new File(extractTo, entry.getName()); 
      if (entry.isDirectory() && !file.exists()) { 
       file.mkdirs(); 
      } else { 
       if (!file.getParentFile().exists()) { 
        file.getParentFile().mkdirs(); 
       } 

       InputStream in = archive.getInputStream(entry); 
       BufferedOutputStream out = new BufferedOutputStream(
         new FileOutputStream(file)); 

       byte[] buffer = new byte[8192]; 
       int read; 

       while (-1 != (read = in.read(buffer))) { 
        out.write(buffer, 0, read); 
       } 

       in.close(); 
       out.close(); 
      } 
     } 
    } 
} 
0

NetworkOnMainThreadException是因爲您嘗試在主線程上執行網絡操作。你應該做的AsyncTask和下載一樣,

文件應該是相當容易,大部分代碼可以去在doInBackground中的AsyncTask

1

請不要寫在主UI線程網絡呼叫,用另一種線程,它會解決你的問題,並看到下面的鏈接瞭解更多信息。的[NetworkOnMainThreadException]

Why Ice Cream Sandwich Crashes Your App