Skip to content

Commit d5aaf63

Browse files
author
YangSen-qn
committed
upload info use copy on write array
1 parent 0d60d22 commit d5aaf63

File tree

4 files changed

+63
-60
lines changed

4 files changed

+63
-60
lines changed

library/library.iml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@
3131
<output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/classes" />
3232
<exclude-output />
3333
<content url="file://$MODULE_DIR$">
34-
<sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debug/out" isTestSource="false" generated="true" />
35-
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />
36-
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
3734
<sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debug/compileDebugRenderscript/out" isTestSource="false" generated="true" />
35+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
36+
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />
37+
<sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debug/out" isTestSource="false" generated="true" />
3838
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" generated="true" />
3939
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" generated="true" />
4040
<sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debugAndroidTest/out" isTestSource="true" generated="true" />
4141
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debugAndroidTest/compileDebugAndroidTestAidl/out" isTestSource="true" generated="true" />
42-
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
4342
<sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debugAndroidTest/compileDebugAndroidTestRenderscript/out" isTestSource="true" generated="true" />
43+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
4444
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" generated="true" />
4545
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" generated="true" />
4646
<sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debugUnitTest/out" isTestSource="true" generated="true" />

library/src/main/java/com/qiniu/android/storage/UploadInfo.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,11 @@ byte[] readData(int dataSize, long dataOffset) throws IOException {
148148
throw new IOException("file is not exist");
149149
}
150150

151-
byte[] data = source.readData(dataSize, dataOffset);
152-
if (data.length != dataSize || data.length == 0) {
151+
byte[] data = null;
152+
synchronized (source) {
153+
data = source.readData(dataSize, dataOffset);
154+
}
155+
if (data != null && (data.length != dataSize || data.length == 0)) {
153156
sourceSize = dataOffset + data.length;
154157
}
155158
return data;

library/src/main/java/com/qiniu/android/storage/UploadInfoV1.java

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.io.IOException;
1212
import java.util.ArrayList;
1313
import java.util.List;
14+
import java.util.concurrent.CopyOnWriteArrayList;
1415

1516
class UploadInfoV1 extends UploadInfo {
1617

@@ -37,7 +38,7 @@ private UploadInfoV1(UploadSource source, int dataSize, List<UploadBlock> blockL
3738
} else {
3839
this.dataSize = configuration.chunkSize;
3940
}
40-
this.blockList = new ArrayList<>();
41+
this.blockList = new CopyOnWriteArrayList<>();
4142
}
4243

4344
static UploadInfoV1 infoFromJson(UploadSource source, JSONObject jsonObject) {
@@ -47,7 +48,7 @@ static UploadInfoV1 infoFromJson(UploadSource source, JSONObject jsonObject) {
4748

4849
int dataSize = 0;
4950
String type = null;
50-
List<UploadBlock> blockList = new ArrayList<>();
51+
List<UploadBlock> blockList = new CopyOnWriteArrayList<>();
5152
try {
5253
type = jsonObject.optString(TypeKey);
5354
dataSize = jsonObject.getInt("dataSize");
@@ -112,7 +113,7 @@ void clearUploadState() {
112113
}
113114

114115
@Override
115-
synchronized long uploadSize() {
116+
long uploadSize() {
116117
if (blockList == null || blockList.size() == 0) {
117118
return 0;
118119
}
@@ -206,34 +207,33 @@ UploadBlock nextUploadBlock() throws IOException {
206207
throw e;
207208
}
208209

209-
synchronized (this) {
210-
if (loadBlock == null) {
211-
// 没有加在到 block, 也即数据源读取结束
212-
isEOF = true;
213-
// 有多余的 block 则移除,移除中包含 block
214-
if (blockList.size() > block.index) {
215-
blockList = blockList.subList(0, block.index);
216-
}
217-
} else {
218-
// 加在到 block
219-
if (loadBlock.index == blockList.size()) {
220-
// 新块:block index 等于 blockList size 则为新创建 block,需要加入 blockList
221-
blockList.add(loadBlock);
222-
} else if (loadBlock != block) {
223-
// 更换块:重新加在了 block, 更换信息
224-
blockList.set(loadBlock.index, loadBlock);
225-
}
210+
if (loadBlock == null) {
211+
// 没有加在到 block, 也即数据源读取结束
212+
isEOF = true;
213+
// 有多余的 block 则移除,移除中包含 block
214+
if (blockList.size() > block.index) {
215+
blockList = blockList.subList(0, block.index);
216+
}
217+
} else {
218+
// 加在到 block
219+
if (loadBlock.index == blockList.size()) {
220+
// 新块:block index 等于 blockList size 则为新创建 block,需要加入 blockList
221+
blockList.add(loadBlock);
222+
} else if (loadBlock != block) {
223+
// 更换块:重新加在了 block, 更换信息
224+
blockList.set(loadBlock.index, loadBlock);
225+
}
226226

227-
// 数据源读取结束,块读取大小小于预期,读取结束
228-
if (loadBlock.size < BlockSize) {
229-
isEOF = true;
230-
// 有多余的 block 则移除,移除中不包含 block
231-
if (blockList.size() > block.index + 1) {
232-
blockList = blockList.subList(0, block.index + 1);
233-
}
227+
// 数据源读取结束,块读取大小小于预期,读取结束
228+
if (loadBlock.size < BlockSize) {
229+
isEOF = true;
230+
// 有多余的 block 则移除,移除中不包含 block
231+
if (blockList.size() > block.index + 1) {
232+
blockList = blockList.subList(0, block.index + 1);
234233
}
235234
}
236235
}
236+
237237
return loadBlock;
238238
}
239239

library/src/main/java/com/qiniu/android/storage/UploadInfoV2.java

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.HashMap;
1313
import java.util.List;
1414
import java.util.Map;
15+
import java.util.concurrent.CopyOnWriteArrayList;
1516

1617
class UploadInfoV2 extends UploadInfo {
1718
private final static String TypeKey = "infoType";
@@ -37,7 +38,7 @@ private UploadInfoV2(UploadSource source, int dataSize, List<UploadData> dataLis
3738
UploadInfoV2(UploadSource source, Configuration configuration) {
3839
super(source);
3940
this.dataSize = Math.min(configuration.chunkSize, maxDataSize);
40-
this.dataList = new ArrayList<>();
41+
this.dataList = new CopyOnWriteArrayList<>();
4142
}
4243

4344
static UploadInfoV2 infoFromJson(UploadSource source, JSONObject jsonObject) {
@@ -49,7 +50,7 @@ static UploadInfoV2 infoFromJson(UploadSource source, JSONObject jsonObject) {
4950
String type = null;
5051
Long expireAt = null;
5152
String uploadId = null;
52-
List<UploadData> dataList = new ArrayList<>();
53+
List<UploadData> dataList = new CopyOnWriteArrayList<>();
5354
try {
5455
type = jsonObject.optString(TypeKey);
5556
dataSize = jsonObject.getInt("dataSize");
@@ -114,34 +115,33 @@ UploadData nextUploadData() throws IOException {
114115
throw e;
115116
}
116117

117-
synchronized (this) {
118-
if (loadData == null) {
119-
// 没有加在到 data, 也即数据源读取结束
120-
isEOF = true;
121-
// 有多余的 data 则移除,移除中包含 data
122-
if (dataList.size() > data.index) {
123-
dataList = dataList.subList(0, data.index);
124-
}
125-
} else {
126-
// 加在到 data
127-
if (loadData.index == dataList.size()) {
128-
// 新块:data index 等于 dataList size 则为新创建 block,需要加入 dataList
129-
dataList.add(loadData);
130-
} else if (loadData != data) {
131-
// 更换块:重新加在了 data, 更换信息
132-
dataList.set(loadData.index, loadData);
133-
}
118+
if (loadData == null) {
119+
// 没有加在到 data, 也即数据源读取结束
120+
isEOF = true;
121+
// 有多余的 data 则移除,移除中包含 data
122+
if (dataList.size() > data.index) {
123+
dataList = dataList.subList(0, data.index);
124+
}
125+
} else {
126+
// 加在到 data
127+
if (loadData.index == dataList.size()) {
128+
// 新块:data index 等于 dataList size 则为新创建 block,需要加入 dataList
129+
dataList.add(loadData);
130+
} else if (loadData != data) {
131+
// 更换块:重新加在了 data, 更换信息
132+
dataList.set(loadData.index, loadData);
133+
}
134134

135-
// 数据源读取结束,块读取大小小于预期,读取结束
136-
if (loadData.size < data.size) {
137-
isEOF = true;
138-
// 有多余的 block 则移除,移除中不包含 block
139-
if (dataList.size() > data.index + 1) {
140-
dataList = dataList.subList(0, data.index + 1);
141-
}
135+
// 数据源读取结束,块读取大小小于预期,读取结束
136+
if (loadData.size < data.size) {
137+
isEOF = true;
138+
// 有多余的 block 则移除,移除中不包含 block
139+
if (dataList.size() > data.index + 1) {
140+
dataList = dataList.subList(0, data.index + 1);
142141
}
143142
}
144143
}
144+
145145
return loadData;
146146
}
147147

@@ -252,7 +252,7 @@ void clearUploadState() {
252252
}
253253

254254
@Override
255-
synchronized long uploadSize() {
255+
long uploadSize() {
256256
if (dataList == null || dataList.size() == 0) {
257257
return 0;
258258
}

0 commit comments

Comments
 (0)