Как сделать индикатор выполнения, чтобы показать прогресс загрузки большого файла с помощью AndroidAnnotations?

У меня есть приложение для Android, и я хочу загрузить большой файл.

Реализация REST API выполнена с помощью AndroidAnnotations. Мне нужно показать индикатор выполнения с загрузкой большого файла с помощью этого REST-клиента (сделанного AndroidAnnotations).

Как мне это сделать?

С уважением


person Mou    schedule 11.12.2014    source источник


Ответы (5)


Здравствуйте. Слишком поздно отвечать на этот вопрос, но это будет полезно тем, кто все еще находит ответы с помощью Android-аннотации.

Вы можете проверить прогресс своего изображения, немного поработав с кодом, и вот что я создал

Пользовательский класс конвертера:-

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);
}
}

--> вы можете проверить свой прогресс в журнале :)

Code Usage

-> Ваш класс отдыха будет следующим: -

@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);

}
person Hardy    schedule 12.01.2016

Конечно, вам придется использовать AsyncTask для загрузки:

Вы можете использовать его методы onPreExecute и onPostExecute для отображения и закрытия 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();
    }
}

Надеюсь это поможет.

person MysticMagicϡ    schedule 11.12.2014
comment
Извините, но мой вопрос касается AndroidAnnotations - person Mou; 11.12.2014

> 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);
}

} }

person Sukhbir    schedule 11.12.2014
comment
Извините, но мой вопрос касается AndroidAnnotations - person Mou; 11.12.2014

С помощью AndroidAnnotations вы можете легко использовать фоновые потоки и прогресс публикации:

@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
  }

}

Теперь вам нужно только выяснить, как вы можете получить события прогресса. Этот ответ может вдохновить. К сожалению, AFAIK не имеет встроенного обратного вызова для этого в шаблоне Spring Android Rest.

person WonderCsabo    schedule 11.12.2014

Я искал решение этой же проблемы, уже два месяца. Наконец нашел хороший пример, я не могу поверить, что все копируют и вставляют одно и то же в документы AndroidAnnotations, если бы этого было достаточно, мы бы не искали здесь помощь.

Вот ссылка, по которой вы можете увидеть пример

Я сделал некоторые изменения сам, на данный момент он работает с некоторыми тостами, но я надеюсь вернуться с фактической анимацией загрузки, чтобы поделиться:

    /*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
       }
person cutiko    schedule 01.04.2015