如何使用AndroidAnnotations显示进度条以显示大文件的进度下载?

时间:2014-12-11 10:40:25

标签: android download progress android-annotations

我有一个Android应用程序,我想下载一个大文件。

使用AndroidAnnotations进行REST API实现。我需要使用此REST客户端(由AndroidAnnotations制作)显示下载大文件的进度条。

我该怎么做?

此致

5 个答案:

答案 0 :(得分:2)

你好回答这个问题已经很晚了但是这对于那些仍在使用Android-annotation查找答案的人来说会很有帮助

你可以通过对代码的一点点操作来检查你的图像进度,这就是我创建的

自定义转换器类: -

public class CustomConverter extends FormHttpMessageConverter {

OnProgressListener mOnProgressListener;

public CustomConverter() {
    super();

    List<HttpMessageConverter<?>> partConverters = new ArrayList<HttpMessageConverter<?>>();
    partConverters.add(new ByteArrayHttpMessageConverter());
    StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
    stringHttpMessageConverter.setWriteAcceptCharset(false);
    partConverters.add(stringHttpMessageConverter);
    partConverters.add(new ProgressResourceHttpMessageConverter());
    setPartConverters(partConverters);
}

// public ProgressFormHttpMessageConverter setOnProgressListener(OnProgressListener listener){ // mOnProgressListener = listener; //返回这个; //}

class ProgressResourceHttpMessageConverter extends ResourceHttpMessageConverter {

    @Override
    protected void writeInternal(Resource resource, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        InputStream inputStream = resource.getInputStream();
        OutputStream outputStream = outputMessage.getBody();

        byte[] buffer = new byte[2048];
        long contentLength = resource.contentLength();
        int byteCount = 0;
        int bytesRead = -1;
        Log.d("<3 <3 <3", "called");
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
            byteCount += bytesRead;
            Log.d("<3 <3 <3 ** ", "progress" + String.valueOf((byteCount * 100) / contentLength));
            if(mOnProgressListener != null) {
                mOnProgressListener.onProgress(resource, byteCount, (int) contentLength);
            }
        }
        outputStream.flush();
    }
}

public interface OnProgressListener {
    void onProgress(Resource resource, int downloaded, int downloadSize);
}
}

- &GT;你可以用日志检查你的进度:)

<强> Code Usage

- &GT;你的休息班如下: -

@Rest(rootUrl = CommonUtils.BASE_URL, converters = {ByteArrayHttpMessageConverter.class,
    CustomConverter.class, StringHttpMessageConverter.class})

public interface CustomRest extends RestClientErrorHandling {


@Post(pUrlSignUp)
String _SignUp(MultiValueMap<String, Object> multiValueMap);

}

答案 1 :(得分:0)

当然,您必须使用AsyncTask进行下载:

您可以使用其方法onPreExecuteonPostExecute分别展示和解除ProgressDialog

示例:

public class DownloadTask extends AsyncTask<String, Integer, String>
{
    ProgressDialog pDialog;
    Activity activity;  //pass your activity reference while initialize this.

    public DownloadTask (Activity activity){
        this.activity = activity;
    }

    @Override
    protected void onPreExecute()
    {
        pDialog = new ProgressDialog(activity);
        pDialog.setMessage("Downloading file...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) 
    {
        //download file's code here
    }

    @Override
    protected void onPostExecute(String result) 
    {
        pDialog.dismiss();
    }
}

希望这有帮助。

答案 2 :(得分:0)

> use AsyncTask method "on progressupdate " to show progress
public class download extends Activity {

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private Button startBtn;
private ProgressDialog mProgressDialog;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    startBtn = (Button)findViewById(R.id.startBtn);
    startBtn.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
            startDownload();
        }
    });
}

private void startDownload() {
    String url = "http://farm1.static.flickr.com/114/298125983_0e4bf66782_b.jpg";
    new DownloadFileAsync().execute(url);
}
@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_DOWNLOAD_PROGRESS:
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Downloading file..");
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
        return mProgressDialog;
    default:
        return null;
    }
}

类DownloadFileAsync扩展了AsyncTask {

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

@Override
protected String doInBackground(String... aurl) {
    int count;

try {

URL url = new URL(aurl[0]);
URLConnection conexion = url.openConnection();
conexion.connect();

int lenghtOfFile = conexion.getContentLength();
Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/some_photo_from_gdansk_poland.jpg");

byte data[] = new byte[1024];

long total = 0;

    while ((count = input.read(data)) != -1) {
        total += count;
        publishProgress(""+(int)((total*100)/lenghtOfFile));
        output.write(data, 0, count);
    }

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

}
protected void onProgressUpdate(String... progress) {
     Log.d("ANDRO_ASYNC",progress[0]);
     mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}

@Override
protected void onPostExecute(String unused) {
    dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}

} }

答案 3 :(得分:0)

使用AndroidAnnotations,您可以轻松使用后台主题和publishing progress

@EActivity
public class MyActivity extends Activity {

  public void onCreate(Bundle icicle) {
    super.onCreate(icicle)
    doSomeStuffInBackground();
  }

  @Background
  void doSomeStuffInBackground() { // will run on a background thread
    publishProgress(0);
    // Do some stuff
    publishProgress(10);
    // Do some stuff
    publishProgress(100);
  }

  @UiThread
  void publishProgress(int progress) { // will run on the UI thread
    // Update progress views
  }

}

现在你只需要弄清楚如何获得进展事件。 This answer可以给予很大的启发。不幸的是AFAIK在Spring Android Rest Template中没有内置的回调。

答案 4 :(得分:0)

我正在寻找解决同样的问题,现在已经两个月了。最后找到了一个很好的例子,我不能相信每个人都在AndroidAnnotations文档中复制粘贴相同,如果这还不够,我们就不会在这里寻求帮助。

Here is the link where you can see the example

我自己做了一些修改,目前它正在使用一些祝酒词,但我希望能够回归一个实际的加载动画来分享:

    /*This background handles my main thread in UI and the progress publish*/
        @Background
        void thisGETJSON() {
            publishProgress(0);
            publishProgress(50);
            publishProgress(100);
            showJSONInUI();
        }

     /*Here the progress is published and the main UI thread is also called*/
        @UiThread
        void publishProgress(int progress) {

            if (progress == 0) {
                Toast toast = Toast.makeText(getApplicationContext(), "Just a sec please", Toast.LENGTH_SHORT);
                toast.show();
            } else if (progress == 50) {
                Toast toast = Toast.makeText(getApplicationContext(), "Loading", Toast.LENGTH_SHORT);
                toast.show();
            } else if (progress == 100) {
                Toast toast = Toast.makeText(getApplicationContext(), "Thanks for waiting", Toast.LENGTH_SHORT);
                toast.show();
            }

      /*This is the main UI thread here I do cool stuff with the JSON objects*/
       @UiThread
       Void showJSONInUI(); {
       //Here I do something with the objects in the JSON
       }