質問編集履歴

2

誤字修正

2020/11/03 08:14

投稿

dvamp
dvamp

スコア39

test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,11 @@
32
32
 
33
33
  https://qiita.com/chouxcreams/items/abb032d8127098dea7d1#%E7%94%BB%E5%83%8F%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B
34
34
 
35
+ ```
36
+
35
- `val (_, _, result) = url.httpGet().awaitByteArrayResponseResult()`
37
+ val (_, _, result) = url.httpGet().awaitByteArrayResponseResult()
38
+
39
+ ```
36
40
 
37
41
 
38
42
 

1

試したことを追記

2020/11/03 08:13

投稿

dvamp
dvamp

スコア39

test CHANGED
@@ -1 +1 @@
1
- Android アプリで OutOfMemoryError を発生させずにファイルをダウンロードする方法がわかりません
1
+ Android アプリで OutOfMemoryError を発生させずに大きなファイルをダウンロードしたい
test CHANGED
@@ -1,12 +1,28 @@
1
- ## 実現したいこと
1
+ ## 前提・実現したいこと
2
2
 
3
3
 
4
4
 
5
- Android アプリで 700 MB のファイルをダウンロードしたい
5
+ ### 環境
6
6
 
7
7
 
8
8
 
9
+ * Windows
10
+
11
+ * Kotlin
12
+
13
+ * Android Studio
14
+
15
+
16
+
17
+ ### 実現したいこと
18
+
19
+
20
+
21
+ Android アプリで 700 MB のファイルをインターネットからアプリのインストールされている端末にダウンロードしたい
22
+
23
+
24
+
9
- ## やったこと
25
+ ## 試したこと
10
26
 
11
27
 
12
28
 
@@ -16,10 +32,74 @@
16
32
 
17
33
  https://qiita.com/chouxcreams/items/abb032d8127098dea7d1#%E7%94%BB%E5%83%8F%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B
18
34
 
35
+ `val (_, _, result) = url.httpGet().awaitByteArrayResponseResult()`
19
36
 
37
+
20
38
 
21
- > val (_, _, result) = url.httpGet().awaitByteArrayResponseResult()
39
+ `java.lang.OutOfMemoryError: Failed to allocate a 892384224 byte allocation with 1556480 free bytes and 510MB until OOM, target footprint 3018616, growth limit 536870912`
40
+
41
+ と表示され、実行できませんでした。
22
42
 
23
43
 
24
44
 
45
+ 次に https://github.com/kittinunf/Fuel のテストコードを参考に
46
+
47
+ 以下のコードを書いたところ
48
+
49
+ ```
50
+
51
+ val (request, response, result) = Fuel.download(url)
52
+
53
+ .fileDestination { _, _ -> File(path + "/" + File) }
54
+
55
+ .progress { _, _ -> progressCalls += 1 }
56
+
57
+ .responseString()
58
+
59
+ val (data, error) = result
60
+
61
+ ```
62
+
63
+
64
+
65
+ `android.os.NetworkOnMainThreadException` というエラーで実行できません。
66
+
67
+
68
+
69
+ 上のエラー解消には Coroutine を使うということが分かったので、以下のコードを追加したのですが、
70
+
71
+ ```
72
+
73
+ val downloader: myDownloader = MyDownloader()
74
+
75
+ val path: String? = Environment.getExternalStorageDirectory().getAbsolutePath();
76
+
77
+ val scope = CoroutineScope(Dispatchers.Default)
78
+
79
+ scope.launch {
80
+
81
+ downloader.download(path, "700MBファイルのURL")
82
+
83
+ }
84
+
85
+ ```
86
+
87
+ やはり以下で
88
+
89
+ ```
90
+
91
+ val (request, response, result) = Fuel.download(url)
92
+
93
+ .fileDestination { _, _ -> File(path + "/" + File) }
94
+
95
+ .progress { _, _ -> progressCalls += 1 }
96
+
97
+ .responseString()
98
+
99
+ val (data, error) = result
100
+
101
+ ```
102
+
25
- `java.lang.OutOfMemoryError: Failed to allocate a 892384224 byte allocation with 1556480 free bytes and 510MB until OOM, target footprint 3018616, growth limit 536870912` と表示され、ダウンロードできませんでした。
103
+ `java.lang.OutOfMemoryError: Failed to allocate a 892384224 byte allocation with 1556480 free bytes and 510MB until OOM, target footprint 3018616, growth limit 536870912`
104
+
105
+ と表示され、実行できませんでした。