Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a6b8824

Browse files
modified Download_a_file_with_Android_and_showing_the_progress_in_a_ProgressDialog.md
1 parent fb7e883 commit a6b8824

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

‎contents/Download_a_file_with_Android_and_showing_the_progress_in_a_ProgressDialog.md‎

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,98 @@ private class DownloadTask extends AsyncTask<String, Integer, String> {
144144
```
145145

146146
### 从服务器上下载文件
147+
148+
这里有个最大的问题:*我怎么从service来更新我的activity?*
149+
在下一个例子当中我们会使用两个你可能不熟悉的类:`ResultReceiver`和`IntentService`。`ResultReceiver`是一个可以允许我们用Service来更新线程的类;`IntentService`是一个可以生成用来处理后台任务的线程的`Service`子类(你需要知道,`Service`实际上是和你的应用运行在同一个线程的;当你继承了`Service`之后,你必须手动生成一个新的线程来处理费时操作)。
150+
151+
一个提供下载功能的`Service`看起来像这样:
152+
153+
```java
154+
public class DownloadService extends IntentService {
155+
public static final int UPDATE_PROGRESS = 8344;
156+
public DownloadService() {
157+
super("DownloadService");
158+
}
159+
@Override
160+
protected void onHandleIntent(Intent intent) {
161+
String urlToDownload = intent.getStringExtra("url");
162+
ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
163+
try {
164+
URL url = new URL(urlToDownload);
165+
URLConnection connection = url.openConnection();
166+
connection.connect();
167+
// 这对你在进度条上面显示百分比很有用
168+
int fileLength = connection.getContentLength();
169+
170+
// download the file
171+
InputStream input = new BufferedInputStream(connection.getInputStream());
172+
OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk");
173+
174+
byte data[] = new byte[1024];
175+
long total = 0;
176+
int count;
177+
while ((count = input.read(data)) != -1) {
178+
total += count;
179+
// 更新进度条....
180+
Bundle resultData = new Bundle();
181+
resultData.putInt("progress" ,(int) (total * 100 / fileLength));
182+
receiver.send(UPDATE_PROGRESS, resultData);
183+
output.write(data, 0, count);
184+
}
185+
186+
output.flush();
187+
output.close();
188+
input.close();
189+
} catch (IOException e) {
190+
e.printStackTrace();
191+
}
192+
193+
Bundle resultData = new Bundle();
194+
resultData.putInt("progress" ,100);
195+
receiver.send(UPDATE_PROGRESS, resultData);
196+
}
197+
}
198+
```
199+
200+
把这个`Service`添加到清单文件中:
201+
```
202+
<service android:name=".DownloadService"/>
203+
```
204+
205+
activity里面的代码:
206+
207+
```java
208+
// 像第一个例子里面一样初始化ProgressBar
209+
210+
// 在这里启动下载
211+
mProgressDialog.show();
212+
Intent intent = new Intent(this, DownloadService.class);
213+
intent.putExtra("url", "url of the file to download");
214+
intent.putExtra("receiver", new DownloadReceiver(new Handler()));
215+
startService(intent);
216+
```
217+
218+
然后像这样来使用`ResultReceiver`:
219+
220+
```java
221+
private class DownloadReceiver extends ResultReceiver{
222+
public DownloadReceiver(Handler handler) {
223+
super(handler);
224+
}
225+
226+
@Override
227+
protected void onReceiveResult(int resultCode, Bundle resultData) {
228+
super.onReceiveResult(resultCode, resultData);
229+
if (resultCode == DownloadService.UPDATE_PROGRESS) {
230+
int progress = resultData.getInt("progress");
231+
mProgressDialog.setProgress(progress);
232+
if (progress == 100) {
233+
mProgressDialog.dismiss();
234+
}
235+
}
236+
}
237+
}
238+
```
239+
240+
#### 使用Groundy
241+
[Groundy](http://casidiablo.github.com/groundy)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /