Android 다 중 스 레 드 정지점 전송 실현 코드
절 차 는 코드 의 주석 에 쓰 여 있다.서버 파일 의 크기 를 가 져 오 는 것 일 수도 있 습 니 다.로 컬 에 같은 크기 의 파일 을 새로 만들어 서 공간 을 신청 한 다음 서버 파일 을 읽 어서 신청 한 파일 에 쓰 십시오.다 중 스 레 드 를 열 면 파일 을 블록 으로 나 누 어 모든 스 레 드 다운로드 의 시작 위치 와 끝 위 치 를 계산 합 니 다.정지점 전송 이 중단 되면 끊 긴 후 다운로드 한 위 치 를 저장 하고 다음 에 이 위 치 를 다운로드 시작 위치 에 부여 하면 됩 니 다.세부 사항 은 코드 참조.
다음은 효과 그림:
레이아웃 파일 activitymain.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/et_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint=" "
android:text="http://10.173.29.234/test.exe" />
<EditText
android:id="@+id/et_threadCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint=" " />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text=" " />
<LinearLayout
android:id="@+id/ll_pb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#455eee"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
모든 스 레 드 의 진 도 를 동적 으로 표시 하기 위해 레이아웃 파일 을 만 듭 니 다.layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity.java:
import...;
public class MainActivity extends AppCompatActivity {
private EditText et_path;
private EditText et_threadCount;
private LinearLayout ll_pb;
private String path;
private static int runningThread;//
private int threadCount;
private List<ProgressBar> pbList;//
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_path = findViewById(R.id.et_path);
et_threadCount = findViewById(R.id.et_threadCount);
ll_pb = findViewById(R.id.ll_pb);
//
pbList = new ArrayList<ProgressBar>();
}
//
public void click(View view) {
//
path = et_path.getText().toString().trim();
//
String threadCounts = et_threadCount.getText().toString().trim();
//
ll_pb.removeAllViews();
threadCount = Integer.parseInt(threadCounts);
pbList.clear();
for (int i = 0; i < threadCount; i++) {
ProgressBar v = (ProgressBar) View.inflate(getApplicationContext(), R.layout.layout, null);
// v
pbList.add(v);
//
ll_pb.addView(v);
}
//java
new Thread() {
@Override
public void run() {
/*************/
System.out.println(" ");
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
int length = conn.getContentLength();
// runningThread
runningThread = threadCount;
System.out.println("length=" + length);
// ,
RandomAccessFile randomAccessFile = new RandomAccessFile(getFileName(path), "rw");
randomAccessFile.setLength(length);
//
int blockSize = length / threadCount;
//
for (int i = 0; i < length; i++) {
int startIndex = i * blockSize;//
int endIndex = (i + 1) * blockSize;//
//
if (i == threadCount - 1) {
//
endIndex = length - 1;
}
//
DownLoadThread downLoadThread = new DownLoadThread(startIndex, endIndex, i);
downLoadThread.start();
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*************/
}
}.start();
}
private class DownLoadThread extends Thread {
//
private int startIndex;
private int endIndex;
private int threadID;
private int PbMaxSize;// ( )
private int pblastPosition;// ,
public DownLoadThread(int startIndex, int endIndex, int threadID) {
this.startIndex = startIndex;
this.endIndex = endIndex;
this.threadID = threadID;
}
@Override
public void run() {
//
try {
//
PbMaxSize = endIndex - startIndex;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
// , ,
File file = new File(getFileName(path) + threadID + ".txt");
if (file.exists() && file.length() > 0) {
FileInputStream fis = new FileInputStream(file);
BufferedReader bufr = new BufferedReader(new InputStreamReader(fis));
String lastPosition = bufr.readLine();
int lastPosition1 = Integer.parseInt(lastPosition);
//
pblastPosition = lastPosition1 - startIndex;
// startIndex
startIndex = lastPosition1 + 1;
System.out.println(" id:" + threadID + " :" + lastPosition + "-------" + endIndex);
bufr.close();
fis.close();
}
conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex);
int code = conn.getResponseCode();
if (code == 206) {
//
RandomAccessFile raf = new RandomAccessFile(getFileName(path), "rw");
//
raf.seek(startIndex);
InputStream in = conn.getInputStream();
//
int len = -1;
byte[] buffer = new byte[1024];
int totle = 0;//
while ((len = in.read(buffer)) != -1) {
raf.write(buffer, 0, len);
totle += len;
// ,
int currentThreadPosition = startIndex + totle;// txt
//
RandomAccessFile raff = new RandomAccessFile(getFileName(path) + threadID + ".txt", "rwd");
raff.write(String.valueOf(currentThreadPosition).getBytes());
raff.close();
//
pbList.get(threadID).setMax(PbMaxSize);
pbList.get(threadID).setProgress(pblastPosition + totle);
}
raf.close();
System.out.println(" ID:" + threadID + " ");
// txt ,
synchronized (DownLoadThread.class) {
runningThread--;
if (runningThread == 0) {
//
for (int i = 0; i < threadCount; i++) {
File filedel = new File(getFileName(path) + i + ".txt");
filedel.delete();
}
}
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public String getFileName(String path) {
int start = path.lastIndexOf("/") + 1;
String subString = path.substring(start);
String fileName = "/data/data/com.lgqrlchinese.heima76android_11_mutildownload/" + subString;
return fileName;
}
}
목록 파일 에 다음 권한 추가
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.