この方法では、いくつかのバックグラウンドプロセスを実行し、同時にUIを更新することができます(この場合は、進行状況バーを更新します)。
これはサンプルコードです:
//あなたの活動のメンバーフィールドとしてダイアログを宣言
ProgressDialog mProgressDialog;
// instantiate it within the onCreate method
mProgressDialog = new ProgressDialog(YourActivity.this);
mProgressDialog.setMessage("A message");
mProgressDialog.setIndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);
//ダウンローダは 最終DownloadTask downloadTask =新しいDownloadTaskを解雇しなければならないときにこれを実行します(YourActivity.this); downloadTask.execute( "ダウンロードしたいファイルへのURL");
mProgressDialog.setOnCancelListener(新しいDialogInterface.OnCancelListener(){ @Override公共ボイドonCancel(DialogInterfaceダイアログ){ downloadTask.cancel(TRUE); }})。 AsyncTaskは次のようになります。
//通常、AsyncTaskのサブクラスはアクティビティクラス内で宣言されます。 //そのように、あなたは簡単にここ プライベートクラスDownloadTaskからUIスレッドがAsyncTask {
private Context context;
private PowerManager.WakeLock mWakeLock;
public DownloadTask(Context context) {
this.context = context;
}
@Override
protected String doInBackground(String... sUrl) {
InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
try {
URL url = new URL(sUrl[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
// expect HTTP 200 OK, so we don't mistakenly save error report
// instead of the file
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
return "Server returned HTTP " + connection.getResponseCode()
+ " " + connection.getResponseMessage();
}
// this will be useful to display download percentage
// might be -1: server did not report the length
int fileLength = connection.getContentLength();
// download the file
input = connection.getInputStream();
output = new FileOutputStream("/sdcard/file_name.extension");
byte data[] = new byte[4096];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
// allow canceling with back button
if (isCancelled()) {
input.close();
return null;
}
total += count;
// publishing the progress....
if (fileLength > 0) // only if total length is known
publishProgress((int) (total * 100/fileLength));
output.write(data, 0, count);
}
} catch (Exception e) {
return e.toString();
} finally {
try {
if (output != null)
output.close();
if (input != null)
input.close();
} catch (IOException ignored) {
}
if (connection != null)
connection.disconnect();
}
return null;
}
(doInBackground)上記の方法を拡張して変更することができますバックグラウンドスレッドで常に動作します。そこにはUIタスクを実行すべきではありません。一方、onProgressUpdateとonPreExecuteは、UIスレッド上で実行するので、そこには、プログレスバーを変更できます。このため
@Override
protected void onPreExecute() {
super.onPreExecute();
// take CPU lock to prevent CPU from going off if the user
// presses the power button during download
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
getClass().getName());
mWakeLock.acquire();
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
// if we get here, length is known, now set indeterminate to false
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String result) {
mWakeLock.release();
mProgressDialog.dismiss();
if (result != null)
Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();
else
Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show();
}
を実行するには、WAKE_LOCK権限が必要です。
<uses-permission android:name="android.permission.WAKE_LOCK" />
変数をローカルに保存できないのはなぜですか? – creativecreatorormaybenot
ローカル変数は、すべてのユーザーに画像がダウンロードされた回数を表示させたいので機能しません。 –
私はあなたの質問を理解したと思います。だから、明確にするために、あなたはどこにイメージをサーバーに保存していますか、ユーザーはどのようにそれらのイメージのURLを取得していますか? –