2012-06-11 39 views
3

在我的应用程序中,有些数据被包裹到一个对象中。 我正在将此对象发送到服务器。一切工作正常。 这里我想在数据加载到服务器时显示进度条。 对于此我使用此代码:Android:将数据上传到服务器的进度条

ProgressThread progThread; 
ProgressDialog progDialog; 

int typeBar; 
int delay = 40; 
int maxBarValue = 200; 
@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case 1: 
     progDialog = new ProgressDialog(this); 
     progDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     progDialog.setMax(maxBarValue); 
     progDialog.setMessage("Data uploading to the Server.."); 
     progThread = new ProgressThread(handler); 
     progThread.start(); 
     return progDialog; 

    default: 
     return null; 
    } 
} 


final Handler handler = new Handler() { 
    public void handleMessage(Message msg) { 
     // Get the current value of the variable total from the message data 
     // and update the progress bar. 
     int total = msg.getData().getInt("total"); 
     progDialog.setProgress(total); 
     if (total <= 0) { 
      dismissDialog(typeBar); 
      progThread.setState(ProgressThread.DONE); 
     } 
    } 
}; 

private class ProgressThread extends Thread { 

    final static int DONE = 0; 
    final static int RUNNING = 1; 

    Handler mHandler; 
    int mState; 
    int total; 

    ProgressThread(Handler h) { 
     mHandler = h; 
    } 


    @Override 
    public void run() { 
     mState = RUNNING; 
     total = maxBarValue; 
     while (mState == RUNNING) { 

      connectServerClass.saveOnServer(Object); 

      Message msg = mHandler.obtainMessage(); 
      Bundle b = new Bundle(); 
      b.putInt("total", total); 
      msg.setData(b); 
      mHandler.sendMessage(msg); 

      total--; // Count down 
     } 
    } 
    public void setState(int state) { 
     mState = state; 
    } 
} 

当在按钮点击用户然后:由上述线我送对象到服务器

typeBar = 1; 
showDialog(typeBar); 

connectServerClass.saveOnServer(对象) 。实际上,我正在将数据发送到另一个类是connectServerClass,并且此类将对象发送到服务器。 但此代码无法正常工作。此代码连接到服务器很多时间。

我用下面的代码:

private class Uploader extends AsyncTask<Void, String, Integer> 
    { 
     private List<File> files; 
     private boolean canceled; 
     private int uploaded; 
     private Account account; 
     private ProgressDialog uploadSeekBar; 

     public Uploader(Account a, List<File> files) 
     { 
      this.account = a; 
      this.files = files; 
     } 

     @Override 
     protected void onPreExecute() 
     { 
      uploadSeekBar.setMax(files.size()); 
      uploadSeekBar.setProgress(0); 
      uploadSeekBar.setVisibility(View.VISIBLE); //Error: the method setVisibility is undefined 
     } 

     @Override 
     protected void onPostExecute(Integer result) 
     { 
      uploadSeekBar.setVisibility(View.INVISIBLE); 
      Toast.makeText(Upload.this, result + " files uploaded", // Error: Upload cannot be resolved to a type 
        Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected void onCancelled() 
     { 
      // XXX need a way to actually cancel the last upload 
      Toast.makeText(Upload.this, "canceling upload", Toast.LENGTH_LONG) 
        .show(); 
      this.canceled = true; 
      uploadSeekBar.setVisibility(View.INVISIBLE); 

     } 

     @Override 
     protected Integer doInBackground(Void... voids) 
     { 
      uploaded = 0; 
      try 
      { 
       Iterator<File> it = this.files.iterator(); 
       while (!canceled && it.hasNext()) 
       { 
        File file = it.next(); 
        it.remove(); 

        String msg = ""; 

        try 
        { 
         if (debugMode) // what is this debugMode 
         { 
               //Put your uploading code here. 
          msg = ("fake uploading " + file); 
          Thread.sleep(3000); 
         } else 
         { 
          msg = ("uploading: " + file); 
          controller.uploadFile(file, this.account); //Error: controller cannot be resolved 
         } 

         uploaded++; 
         publishProgress(msg); 

        } catch (IOException e) 
        { 
         controller.te("error uploading file: " + file); 
         controller.te("error uploading file: " + e); 
        } catch (InterruptedException e) 
        { 
        } 
       } 
      } catch (Exception e) 
      { 
       publishProgress("error uploading: " + e); 
      } 

      return uploaded; 
     } 

     @Override 
     protected void onProgressUpdate(String... strings) 
     { 
      uploadSeekBar.setProgress(uploaded); 
      updateUploadMessage(files.size()); 
      Toast.makeText(Upload.this, strings[0], Toast.LENGTH_LONG).show(); //Error: The method updateUploadMessage(int) is undefined for the type FirstActivity.Uploader 
     } 
    } 

但我面临的一些错误,我提到在该行右边评论。请建议我。

+0

我的这个[answer](http://stackoverflow.com/a/9078502/996493)可能对您有所帮助。 – Lucifer

回答

3

我强烈建议您使用AsyncTask。

下面的代码片段将帮助你如何看待你的AsyncTask。

package org.sample; 

import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.List; 

import android.accounts.Account; 
import android.os.AsyncTask; 
import android.view.View; 
import android.widget.Toast; 

    private class Uploader extends AsyncTask<Void, String, Integer> 
    { 
     private List<File> files; 
     private boolean canceled; 
     private int uploaded; 

     public Uploader(Account a, List<File> files) 
     { 
      this.account = a; 
      this.files = files; 
     } 

     @Override 
     protected void onPreExecute() 
     { 
      uploadSeekBar.setMax(files.size()); 
      uploadSeekBar.setProgress(0); 
      uploadSeekBar.setVisibility(View.VISIBLE); 
     } 

     @Override 
     protected void onPostExecute(Integer result) 
     { 
      uploadSeekBar.setVisibility(View.INVISIBLE); 
      Toast.makeText(Upload.this, result + " files uploaded", 
        Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected void onCancelled() 
     { 
      // XXX need a way to actually cancel the last upload 
      Toast.makeText(Upload.this, "canceling upload", Toast.LENGTH_LONG) 
        .show(); 
      this.canceled = true; 
      uploadSeekBar.setVisibility(View.INVISIBLE); 

     } 

     @Override 
     protected Integer doInBackground(Void... voids) 
     { 
      uploaded = 0; 
      try 
      { 
       Iterator<File> it = this.files.iterator(); 
       while (!canceled && it.hasNext()) 
       { 
        File file = it.next(); 
        it.remove(); 

        String msg = ""; 

        try 
        { 
         if (debugMode) 
         { 
               //Put your uploading code here. 
          msg = ("fake uploading " + file); 
          Thread.sleep(3000); 
         } else 
         { 
          msg = ("uploading: " + file); 
          controller.uploadFile(file, this.account); 
         } 

         uploaded++; 
         publishProgress(msg); 

        } catch (IOException e) 
        { 
         controller.te("error uploading file: " + file); 
         controller.te("error uploading file: " + e); 
        } catch (InterruptedException e) 
        { 
        } 
       } 
      } catch (Exception e) 
      { 
       publishProgress("error uploading: " + e); 
      } 

      return uploaded; 
     } 

     @Override 
     protected void onProgressUpdate(String... strings) 
     { 
      uploadSeekBar.setProgress(uploaded); 
      updateUploadMessage(files.size()); 
      Toast.makeText(Upload.this, strings[0], Toast.LENGTH_LONG).show(); 
     } 
    } 
+0

thanx Vipul ....所以我需要写代码到doInBackground方法,它是connectServerClass.saveOnServer(Object) –

+0

完美!您可以在doInBackground中编写上传代码,一旦完成,您可以在onPostExecute中显示成功/失败消息! –

+0

@VinitVikash如果它解决了你的问题,那么你可以把这个答案标记为Accepted所以这对其他人会有帮助。 –

相关问题