2015-06-03 39 views
0

在Asynctask中,进度条正在工作或文件正在成功上传。 当我们在COMMENT1行之前写入,但进度条不起作用时,COMMENT2行正确地上传文件。 但是,如果我们在COMMENT1之后编写COMMENT2,那么我们将面对ERROR代码500(语法错误)并且上传失败,但进度条 正常工作。进度条对话框不支持在android中上传FTP

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

int bytesRead, bytesAvailable, bufferSize = 1024,progress; 
byte[] buffer; 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    mProgressDialog = new ProgressDialog(getActivity()); 
    mProgressDialog.setMessage("Uploading file.."); 
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    mProgressDialog.setIndeterminate(false); 
    mProgressDialog.setCancelable(false); 
    mProgressDialog.setProgress(0); 
    mProgressDialog.setMax(100); 
    mProgressDialog.show(); 

} 

@Override 
protected String doInBackground(String... params) { 
    // TODO Auto-generated method stub 
    // connection(); 
    FTPClient con = null; 

     try 
     { 
      con = new FTPClient(); 
      con.connect(FTP_HOST); 

      if (con.login(FTP_USER, FTP_PASS)) 
      { 
       con.enterLocalActiveMode(); // important! 
       con.setFileType(FTP.BINARY_FILE_TYPE); 
       con.changeWorkingDirectory("/uploads/school-staging/files/"); 
       String data = FilePath; 
       final DataOutputStream out = new DataOutputStream(con.getOutputStream()); 
       BufferedInputStream in = new BufferedInputStream(new FileInputStream(data)); 
       int bufferSize=1024; 
       byte[] buffer = new byte[bufferSize]; 
       // Read file 

       bytesRead = in.read(buffer, 0, bufferSize);//COMMENT 1 
       progress=0; 

       System.out.println("BYTE READ="+bytesRead); 

       while (bytesRead > 0) 
       { 

        progress+=bytesRead; 
        System.out.println("PROGRESS="+progress); 
        out.write(buffer, 0, bytesRead); 
        bytesAvailable = in.available(); 
        publishProgress((int)((progress*100)/(file.length()))); 
        bufferSize = Math.min(bytesAvailable, bufferSize); 

        bytesRead = in.read(buffer, 0, bufferSize); 

       } 
      boolean result = con.storeFile(FileName, in);//COMMENT 2 
       int code= con.getReplyCode(); 
         System.out.println("CODE="+code); 
       in.close(); 
       publishProgress(100); 

       if (result) Log.v("upload result", "succeeded"); 
       System.out.println("RESULT="+result); 
       con.logout(); 
       con.disconnect(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

    return "ok"; 
} 

@Override 
public void onProgressUpdate(Integer... values) 
    { 
     super.onProgressUpdate(values); 
     mProgressDialog.setProgress(values[0]); 
    }//end of onProgressUpdate 


@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    connection(); 
    mProgressDialog.dismiss(); 
} 

回答

0

我遇到了类似的问题。这样做的原因似乎是onPreExecute()中的ui代码无法通过android系统呈现,并且doInBackground()中的代码占用了cpu。您可以关闭onPostExecute()中的对话框,但...

您必须在创建AsyncCaller之前显示进度对话框,将进度对话框传递给AsyncCaller,并且可以在onPostExecute()中将其解除。

ProgressDialog pd = new ProgressDialog(getActivity()); 
    pd.setTitle("title string"); 
    pd.setIndeterminate(true); 
    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    pd.show(); 

    new AsyncCaller(getActivity(), pd).execute(params); 

    in onPostExecute(): 
     if (pd != null && pd.isShowing()) 
      pd.dismiss();