2013-06-24 34 views
1

我要實現FTP下載功能。它的工作原理,但是當它涉及到的進展報告,我才發現,只有消息的變化而不是數量和酒吧改變Android進度對話框只更新消息,不是酒吧和行

我有屏幕捕獲如下

enter image description here

以下是我的代碼:

public void buttonExit(View v) { 
    System.exit(1); 
} 

public void doClick(View v){ 

    //ftp 

    filename = null; 
    filename = "giant.mp4"; 

    pd = new ProgressDialog(this); 
    pd.setTitle("EOrder"); 
    pd.setMessage("Downloading file. Please wait..."); 
    pd.setIndeterminate(true); 
    pd.setMax(100); 
    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    pd.setProgress(0); 
    pd.setCancelable(false); 
    pd.show(); 

    ad = new AlertDialog.Builder(this); 
    ad.setTitle("EOrder"); 
    ad.setMessage("Download Finish"); 
    ad.setNeutralButton("OK", null); 

    new FTPDownload().execute(filename); 
} 

class FTPDownload extends AsyncTask<String , String , Void>{ 

    boolean running = true; 

    Date today = Calendar.getInstance().getTime();  
    Format formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss"); 
    String reportDate = formatter.format(today); 


    String fileAndroid = reportDate + "_" + filename; 

    @Override 
    protected Void doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     Log.d("******", "Background thread starting......"); 

     FTPClient client = new FTPClient(); 

     try { 
      Log.d("tag" , "arrived"); 

      client.connect("newaswrissssing.win5.siteonlinetest.com"); 
      boolean successLogin = client.login("newaswrissssing", "newaswrissssing2014cap!"); 


      if(successLogin){ 
       client.changeWorkingDirectory("dummy"); 
       Log.d("tag" , "success"); 
       long fileSize = getFileSize(client , params[0]); 
       client.setFileType(FTP.BINARY_FILE_TYPE); 
       client.enterLocalPassiveMode(); 

       File instanceRecordDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "TVB_Movie"); 

       if(!instanceRecordDirectory.exists()){ 
        instanceRecordDirectory.mkdirs(); 
       } 

       File instanceRecord = new File(instanceRecordDirectory.getAbsolutePath() + File.separator + fileAndroid); 

       if(!instanceRecord.exists()){ 
        instanceRecord.createNewFile(); 
       } 

       BufferedOutputStream desFileStream = new BufferedOutputStream(new FileOutputStream(instanceRecord.getAbsolutePath()),8*1024); 


       InputStream in = client.retrieveFileStream(params[0]); 

       Log.d("as" , String.valueOf(in)); 

       byte[] buffer = new byte[1024]; 
       int len1 = 0; 
       long total = 0; 

       while ((len1 = in.read(buffer)) > 0) { 
        total += len1; //total = total + len1 
        Log.d("aDDs" , String.valueOf(in)); 
        publishProgress("" + (int)((total*100)/fileSize)); 
        desFileStream.write(buffer, 0, len1); 
       } 

       desFileStream.flush(); 
       desFileStream.close(); 

       client.completePendingCommand(); 
       in.close(); 

      }else{ 
       Log.d("tag" , "sosad"); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      try { 
       client.logout(); 
       client.disconnect(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    protected void onProgressUpdate(String... progress) { 
     super.onProgressUpdate(progress);   
     Log.d("progress","values: "+progress[0]); 
     pd.incrementProgressBy(Integer.parseInt(progress[0])); 
     pd.setMessage("Downloading file... Progress at " + progress[0] + "%");  
    } 

    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     pd.dismiss(); 
      ad.show(); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

請你告訴我,除了使用pd.incrementProgressBy(Integer.parseInt(progress[0]));setProgress做哪些其他措施?

回答

6

你的ProgressDialog不應該是intederminate。你應該叫setIndeterminatefalse代替true

pd.setIndeterminate(false); 

,你應該使用setProgress代替incrementProgressBy

+0

有什麼方法,提升的AsyncTask的表現? –

+0

@RajuGujarati AsyncTask基本上是一個線程。其執行時間與doInBackground中的代碼嚴格相關。更多的代碼複雜更多的時間其exectuions將需要 – Blackbelt

+0

這意味着如果我根據最大MTU增加到緩衝區大小但少於9000,我試圖提高性能? –