Я использую общедоступный AsynTask для загрузки данных, и я пытаюсь показать индикатор выполнения, который показал бы прогресс загрузки. Я думаю, что имею право кода, но все, что я получаю, является счетчиком progressdialog. Я пропускаю что-то? Почему индикатор выполнения не обнаруживается? Вот код. Спасибо за любые указатели.
public class FileDownloader extends AsyncTask<String, Integer, Void>
{
private Context _appContext;
private HttpURLConnection _urlConn;
private ProgressDialog _progressDia = null;
private DialogInterface.OnCancelListener _progDiaCancelListener = new DialogInterface.OnCancelListener()
{
/**
* When the progress dialog is canceled, stop the GET request.
*/
public void onCancel(DialogInterface dialog)
{
FileDownloader.this.cancel(true);
}
};
/**
* Constructor.
* @param appContext
*/
public FileDownloader(Context appContext)
{
_appContext = appContext;
_progressDia = new ProgressDialog(_appContext, ProgressDialog.STYLE_HORIZONTAL);
_progressDia.setMax(100);
_progressDia.setTitle(_appContext.getString(R.string.diaHeader1));
_progressDia.setMessage(_appContext.getString(R.string.diaBody1));
_progressDia.setCancelable(true);
_progressDia.setIndeterminate(false);
_progressDia.setOnCancelListener(_progDiaCancelListener);
}
// Runs on the UI thread
@Override
protected void onPreExecute()
{
_progressDia.setProgress(0);
_progressDia.show();
}
@Override
protected Void doInBackground(String... args)
{
String dloadURL = args[0],
saveLoc = args[1];
...
...
while((len = input.read(buf)) > 0)
{
output.write(buf, 0, len);
total += len;
publishProgress((int)total * 100/lenghtOfFile);
}
...
...
}
catch(SocketTimeoutException ex)
{
}
finally
{
...
}
// This is executed on main UI thread.
@Override
protected void onProgressUpdate(Integer... values)
{
_progressDia.setProgress(values[0]);
}
@Override
protected void onCancelled()
{
...
}
// This is executed on main UI thread.
@Override
protected void onPostExecute(Void result)
{
removeProgressDialog();
...
}
/**
* Remove the message dialog, if still showing.
*/
private void removeProgressDialog()
{
if(_progressDia != null && _progressDia.isShowing())
_progressDia.dismiss();
}
}
Возможно, вы забыли установить dialog.setProgressStyle (ProgressDialog. STYLE_HORIZONTAL);
См. Этот пример кода, который мне подходит:
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(this);
dialog.setMessage("Matching progress");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.setCancelable(false);
dialog.show();
}
/*
* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Void doInBackground(Void... params) {
return null;
}
protected void onPostExecute(Void result) {
dialog.hide();
dialog = null;
}
сделать ввод прогресс-бара в вашем android проекте текущий XML файл намерения в качестве прогресс-бара
также проверьте его после сохранения в файле R.java на наличие id вашего прогресс-бара
намерение должно вызываться каждый раз, когда начинается загрузка
например
startActivity(new Intent(this, Progress.class));
Похоже, что вы используете конструктор с двумя аргументами для ProgressDialog, который в документации предлагается для контекста (первый аргумент) и идентификатора темы (второй аргумент).
Итак, пока вы ДУМАЕТЕ, что устанавливаете ProgressStyle на STYLE_HORIZONTAL , вы вообще этого не делаете, вы устанавливаете идентификатор темы на то, что, вероятно, не является допустимым идентификатором темы.
Я бы посоветовал использовать один конструктор arg, который принимает контекст, а затем делать так, как предлагает Pentium10, и вызывать _progressDia.setProgressStyle (ProgressStyle.STYLE_HORIZONTAL);
вы также можете задать ему этот тег в xml-файле
style="@android:style/Widget.ProgressBar.Horizontal"