2012-12-09 69 views
2
  1. 我試圖下載Android的一個文件,並顯示進度下載的進度 如何下載文件並在Android中顯示進度?

    1. 顯示TextView的下載速度
    2. 顯示文件的大小的TextView

    下載文件

我已經能夠同時顯示進度條,但在for循環中, 當我運行代碼時給我錯誤:NullPointerExceptoin。但並沒有說它也給我了哪一行FileNotFoundException。我不知道我做錯了什麼。 我對Android很新,所以如果有人能幫上忙,那就太棒了。這是代碼。我在清單文件中提供了權限。

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

這裏是活動,我只使用這個活動。

public class DownloadActivity extends Activity implements OnClickListener { 

    TextView view1; 
    TextView view2; 
    TextView view3; 
    ProgressBar bar; 
    Button startButton; 
    String contents; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_download); 
     startButton = (Button) findViewById(R.id.button1); 
     bar = (ProgressBar) findViewById(R.id.progressBar1); 
     startButton.setOnClickListener((OnClickListener) this); 
//  contents = urlToString("https://www.dropbox.com/home/Music/FOX%20-%20Pokazn%D0%BE%CC%81%20(2012)"); 
     contents = "http://sdlc-esd.sun.com/ESD6/JSCDL/jdk/7u9-b05/jre-7u9-windows-i586.exe?AuthParam=1355055216_89a14482cb59e95946db732dc4341468&GroupName=JSC&FilePath=/ESD6/JSCDL/jdk/7u9-b05/jre-7u9-windows-i586.exe&File=jre-7u9-windows-i586.exe&BHost=javadl.sun.com"; 
     urlToString(contents); 
//  http://ipv4.download.thinkbroadband.com/10MB.zip 
//  http://sdlc-esd.sun.com/ESD6/JSCDL/jdk/7u9-b05/jre-7u9-windows-i586.exe?AuthParam=1355055216_89a14482cb59e95946db732dc4341468&GroupName=JSC&FilePath=/ESD6/JSCDL/jdk/7u9-b05/jre-7u9-windows-i586.exe&File=jre-7u9-windows-i586.exe&BHost=javadl.sun.com 
    } 


    public void onClick(View view) { 

     // detect the view that was "clicked" 
     switch (view.getId()) { 
     case R.id.button1: 
      new LongOperation().execute(1000 + ""); 
      break; 
     } 
    } 

    private class LongOperation extends AsyncTask<String, Integer, String> { 


     @Override 
     protected String doInBackground(String... sUrl) { 
      try { 
       URL url = new URL(sUrl[0]); 
       URLConnection connection = url.openConnection(); 
       connection.connect(); 

       // this will be useful so that you can show a typical 0-100% progress bar 
       int fileLength = connection.getContentLength(); 

       // download the file 
       InputStream input = new BufferedInputStream(url.openStream()); 
       OutputStream output = new FileOutputStream(contents); 

       byte data[] = new byte[1024]; 
       long total = 0; 
       int count; 
       while ((count = input.read(data)) != -1) 
       { 
        total += count; 
        // publishing the progress.... triggers the onProgressUpdate! 
        publishProgress((int) (total * 100/fileLength)); 

        output.write(data, 0, count); 
       } 

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

      for (int i = 0; i < 100; i++) { 
       try { 


        Thread.sleep(500); 
        publishProgress(i+1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      return "URL:" + contents; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      TextView txt = (TextView) findViewById(R.id.textView1); 
      txt.setText(result); 
     } 

     @Override 
      protected void onProgressUpdate(Integer... values) { 
      // TODO Auto-generated method stub 
      bar.setProgress(values[0]); 
      view1 = (TextView) findViewById(R.id.textView1); 
      view2 = (TextView) findViewById(R.id.textView2); 
      view3 = (TextView) findViewById(R.id.textView3); 


      view1.setText("URL: " + contents); 
      view2.setText("File Size: " + "x"); 
      view3.setText("Transfer Rate: " + "y"); 
      } 
    } 



// Log.v("********", getLinkRate()); 

    private String urlToString(String address) { 
     HttpURLConnection con = null; 
     URL url; 
     InputStream is = null; 
     try { 
      url = new URL(address); 
      con = (HttpURLConnection) url.openConnection(); 
      con.setReadTimeout(10000); 
      con.setConnectTimeout(15000); 
      con.setRequestMethod("GET"); 
      con.connect(); 
      is = con.getInputStream(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     BufferedReader reader = null; 
     StringBuilder sb = new StringBuilder(); 
     try { 
      reader = new BufferedReader(new InputStreamReader(is)); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 

       Log.d("*******", line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      if (is != null) { 
       try { 
        is.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     return sb.toString(); 
    } 
} 

的logcat:

12-09 12:53:57.608: D/*******(824): Ty���mk�B$1�-2 
12-09 12:53:57.648: D/dalvikvm(824): GC_FOR_MALLOC freed 202K, 62% free 7797K/20487K, external 1625K/2137K, paused 31ms 
12-09 12:53:57.648: I/dalvikvm-heap(824): Forcing collection of SoftReferences for 7981588-byte allocation 
12-09 12:53:57.669: D/dalvikvm(824): GC_FOR_MALLOC freed 1K, 62% free 7796K/20487K, external 1625K/2137K, paused 26ms 
12-09 12:53:57.669: E/dalvikvm-heap(824): Out of memory on a 7981588-byte allocation. 
12-09 12:53:57.669: I/dalvikvm(824): "main" prio=5 tid=1 RUNNABLE 
12-09 12:53:57.678: I/dalvikvm(824): | group="main" sCount=0 dsCount=0 obj=0x4001f1a8 self=0xce48 
12-09 12:53:57.678: I/dalvikvm(824): | sysTid=824 nice=0 sched=0/0 cgrp=default handle=-1345006528 
12-09 12:53:57.678: I/dalvikvm(824): | schedstat=(6672852716 8933397811 8674) 
12-09 12:53:57.678: I/dalvikvm(824): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:~95) 
12-09 12:53:57.678: I/dalvikvm(824): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:153) 
12-09 12:53:57.678: I/dalvikvm(824): at java.lang.StringBuilder.append(StringBuilder.java:217) 
12-09 12:53:57.678: I/dalvikvm(824): at tees.ac.uk.L1087591.DownloadActivity.urlToString(DownloadActivity.java:156) 
12-09 12:53:57.678: I/dalvikvm(824): at tees.ac.uk.L1087591.DownloadActivity.onClick(DownloadActivity.java:54) 
12-09 12:53:57.678: I/dalvikvm(824): at android.view.View.performClick(View.java:2485) 
12-09 12:53:57.678: I/dalvikvm(824): at android.view.View$PerformClick.run(View.java:9080) 
12-09 12:53:57.678: I/dalvikvm(824): at android.os.Handler.handleCallback(Handler.java:587) 
12-09 12:53:57.678: I/dalvikvm(824): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-09 12:53:57.678: I/dalvikvm(824): at android.os.Looper.loop(Looper.java:123) 
12-09 12:53:57.678: I/dalvikvm(824): at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-09 12:53:57.678: I/dalvikvm(824): at java.lang.reflect.Method.invokeNative(Native Method) 
12-09 12:53:57.678: I/dalvikvm(824): at java.lang.reflect.Method.invoke(Method.java:507) 
12-09 12:53:57.678: I/dalvikvm(824): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-09 12:53:57.678: I/dalvikvm(824): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-09 12:53:57.678: I/dalvikvm(824): at dalvik.system.NativeStart.main(Native Method) 
12-09 12:53:57.688: D/AndroidRuntime(824): Shutting down VM 
12-09 12:53:57.688: W/dalvikvm(824): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
12-09 12:53:57.688: E/AndroidRuntime(824): FATAL EXCEPTION: main 
12-09 12:53:57.688: E/AndroidRuntime(824): java.lang.OutOfMemoryError 
12-09 12:53:57.688: E/AndroidRuntime(824): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) 
12-09 12:53:57.688: E/AndroidRuntime(824): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:153) 
12-09 12:53:57.688: E/AndroidRuntime(824): at java.lang.StringBuilder.append(StringBuilder.java:217) 
12-09 12:53:57.688: E/AndroidRuntime(824): at tees.ac.uk.L1087591.DownloadActivity.urlToString(DownloadActivity.java:156) 
12-09 12:53:57.688: E/AndroidRuntime(824): at tees.ac.uk.L1087591.DownloadActivity.onClick(DownloadActivity.java:54) 
12-09 12:53:57.688: E/AndroidRuntime(824): at android.view.View.performClick(View.java:2485) 
12-09 12:53:57.688: E/AndroidRuntime(824): at android.view.View$PerformClick.run(View.java:9080) 
12-09 12:53:57.688: E/AndroidRuntime(824): at android.os.Handler.handleCallback(Handler.java:587) 
12-09 12:53:57.688: E/AndroidRuntime(824): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-09 12:53:57.688: E/AndroidRuntime(824): at android.os.Looper.loop(Looper.java:123) 
12-09 12:53:57.688: E/AndroidRuntime(824): at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-09 12:53:57.688: E/AndroidRuntime(824): at java.lang.reflect.Method.invokeNative(Native Method) 
12-09 12:53:57.688: E/AndroidRuntime(824): at java.lang.reflect.Method.invoke(Method.java:507) 
12-09 12:53:57.688: E/AndroidRuntime(824): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-09 12:53:57.688: E/AndroidRuntime(824): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-09 12:53:57.688: E/AndroidRuntime(824): at dalvik.system.NativeStart.main(Native Method) 
12-09 12:53:59.688: I/Process(824): Sending signal. PID: 824 SIG: 9 

回答

1

檢查處理不如果您在實際運行的代碼放在槽try{}catch(){}塊,然後才繼續進行代碼的其餘部分,因爲如果沒有找到文件,你應該停止的AsyncTask並顯示錯誤消息

你在呼喚你的AsyncTask這樣

new LongOperation().execute(1000 + ""); 

所以你通過1000 + ""作爲url參數?當你聲明的AsyncTask這樣

private class LongOperation extends AsyncTask<String, Integer, String> 

你想傳遞的字符串作爲參數,你會得到整數作爲onProgressUpdate()進度,最後得到字符串的AsyncTask

的結果

你也不能有網絡在你onCreate()主線程,你在呼喚

urlToString(contents); 
+0

我用.execut(內容)替換它,其中內容是我不想下載的url,但它給了我同樣的錯誤。 –

+0

你是否嘗試從瀏覽器調用內容?也許沒有什麼可下載的 – vodich

+0

鏈接正在工作。 –

1

你要調試的活動,找出哪一行拋出NullPointerException異常。

+0

在LogCat中並沒有說它在哪一行,它只是說它在這個活動中是項目中唯一的一個 –

+0

在oncreate函數上使用斷點並進入你的代碼,你的應用程序將崩潰並且拋出錯誤在線,拋出NullPointerException所以你可以專注於該特定線 –

1

在你的OnCreate函數使用的是一種叫做urlToString方法,它創建了一個HttpURLConnection類,如果你運行它在4.0以上那麼你的代碼將崩潰,因爲HHTP連接應該在後臺線程主線程

+0

好吧,我使用的API級別10是2.3.3 –

+0

然後你必須調試你的代碼,並檢查你是否已經設置所有的ID在你的XML你的代碼,因爲這將導致NullpointerException –

1

你開始用的AsyncTask「新LongOperation()。執行(1000 +‘’)」, 因此字符串「1000」傳遞給doInBackground我thod,那麼你開始使用字符串「1000」的URLConnection,但「1000」是一個無效的url。 也許這是錯誤。

+0

而且帶有很長時間的urlConnection任務的urlToString函數必須阻塞UI線程。您必須在後臺線程中執行URLConnection。 – TaoZang

相關問題