android startactivity 多线程,新手 android 多线程

package com.payne.xiazai;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.text.TextUtils;

import android.view.View;

import android.widget.EditText;

import android.widget.ProgressBar;

import android.widget.Toast;

public class MainActivity extends Activity {

protected static final int DOWN_LOAD_ERROR = 1;

protected static final int SERVER_ERROR = 2;

public static int threadCount = 3;

public static int runningThread = 3;

private EditText et_path;

private ProgressBar pb;

private Handler handler=new Handler(){

public void handleMessage(Message msg) {

switch (msg.what) {

case DOWN_LOAD_ERROR:

Toast.makeText(getApplicationContext(),"下载失败", Toast.LENGTH_SHORT).show();

break;

case SERVER_ERROR:

Toast.makeText(getApplicationContext(),"服务器错误,下载失败", Toast.LENGTH_SHORT).show();

break;

}

};

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et_path=(EditText)this.findViewById(R.id.editText1);

pb=(ProgressBar) findViewById(R.id.progressBar1);

}

public void click(View view){

final String path=et_path.getText().toString().trim();

if(TextUtils.isEmpty(path)){

Toast.makeText(this,"下载路径错误",Toast.LENGTH_SHORT).show();

return;

}

new Thread(){

public void run() {

try {

//String path = "http://127.0.0.1:8080/setup.exe";

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

int code = conn.getResponseCode();

if (code == 200) {

int length = conn.getContentLength();

System.out.println("文件中长度" + length);

// 在客户端本地创建出来一个跟服务器端文件一样大小的临时文件

RandomAccessFile raf = new RandomAccessFile("/sdcard/setup.exe", "rwd");

// 指定创建这个文件的长度

raf.setLength(length);

raf.close();

// 假设是3个线程去下载资源

// 平均每个线程下载的文件大小

int blockSize = length / threadCount;

for (int threadId = 1; threadId <= threadCount; threadId++) {

// 下载的开始位置

int startIndex = (threadId - 1) * blockSize;

// 下载的结束位置

int endIndex = (threadId * blockSize) - 1;

if (threadId == threadCount) {

// 最后一个线程下载的位置

endIndex = length;

}

System.out.println("线程:" + threadId + "下载:----" + startIndex

+ "--->" + endIndex);

new DownlodThread(startIndex, endIndex, threadId, path).start();

}

} else {

System.out.println("服务器错误");

Message msg=new Message();

msg.what=SERVER_ERROR;

handler.sendMessage(msg);

}

}catch (IOException e) {

e.printStackTrace();

Message msg=new Message();

msg.what=DOWN_LOAD_ERROR;

handler.sendMessage(msg);

}

};

}.start();

}

/**

* 下载文件的子线程 每一个线程下载对应位置的文件

*

* @author Payne

*

*/

public class DownlodThread extends Thread {

private int startIndex;

private int endIndex;

private int threadId;

private String path;

public DownlodThread(int startIndex, int endIndex, int threadId,

String path) {

super();

this.startIndex = startIndex;

this.endIndex = endIndex;

this.threadId = threadId;

this.path = path;

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

File temp = new File("/sdcard/"+threadId + ".txt");

if (temp.exists() && temp.length() > 0) {

FileInputStream fis = new FileInputStream(temp);

byte[] tempBytes = new byte[1024];

int leng = fis.read(tempBytes);

String downloadLen = new String(tempBytes, 0, leng);

int downloadInt = Integer.parseInt(downloadLen);

startIndex = downloadInt;

fis.close();

}

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url

.openConnection();

conn.setReadTimeout(5000);

conn.setRequestMethod("GET");

// 重要:请求服务器下载部分的文件 指定文件的位置

conn.setRequestProperty("Range", "bytes=" + startIndex + "-"

+ endIndex);

System.out.println("真实线程:" + threadId + "

+ "--->" + endIndex);

int code = conn.getResponseCode();// 从服务器请求全部资源200 ok

// 如果从服务器返回部分资源206 ok

//System.out.println("code:" + code);

if (code == 206) {

InputStream is = conn.getInputStream();// 已经设置了请求的位置

// 返回的是当前位置对应的文件的输入流

RandomAccessFile raf = new RandomAccessFile("/sdcard/setup.exe",

"rwd");

// 随机写文件的时候从那个位置开始写

raf.seek(startIndex);// 定位线程

int len = 0;

int total = 0;

byte[] buffer = new byte[1024];

while ((len = is.read(buffer)) != -1) {

RandomAccessFile file = new RandomAccessFile("/sdcard/"+threadId

+ ".txt", "rwd");

raf.write(buffer, 0, len);

total += len;

//System.out.println("线程:" + threadId + "total" + total);

file.write((startIndex + total + "").getBytes());

file.close();

}

is.close();

raf.close();

System.out.println("线程:" + threadId + "下载完毕!");

} else {

System.out.println("线程:" + threadId + "下载失败");

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

runningThread--;

if(runningThread==0){//所以线程已经执行完毕

for(int i=1;i<=3;i++){

File file=new File("/sdcard/"+i+".txt");

file.delete();

}

System.out.println("所以下载记录已经被清除");

}

}

}

}

}

logcat

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/KeypressStandard.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/KeypressStandard.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/KeypressSpacebar.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/KeypressSpacebar.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/KeypressDelete.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/KeypressDelete.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/KeypressReturn.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/KeypressReturn.ogg

04-19 19:42:02.422: E/SoundPool(1272): error loading /system/media/audio/ui/KeypressInvalid.ogg

04-19 19:42:02.422: W/AudioService(1272): Soundpool could not load file: /system/media/audio/ui/KeypressInvalid.ogg

04-19 19:42:02.422: W/AudioService(1272): onLoadSoundEffects(), Error -1 while loading samples

04-19 19:42:02.432: W/System.err(7536): java.net.ConnectException: failed to connect to /127.0.0.1 (port 8080) after 5000ms: isConnected failed: ECONNREFUSED (Connection refused)

04-19 19:42:02.432: W/System.err(7536): at libcore.io.IoBridge.isConnected(IoBridge.java:223)

04-19 19:42:02.432: W/System.err(7536): at libcore.io.IoBridge.connectErrno(IoBridge.java:161)

04-19 19:42:02.432: W/System.err(7536): at libcore.io.IoBridge.connect(IoBridge.java:112)

04-19 19:42:02.432: W/System.err(7536): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)

04-19 19:42:02.432: W/System.err(7536): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)

04-19 19:42:02.432: W/System.err(7536): at java.net.Socket.connect(Socket.java:843)

04-19 19:42:02.432: W/System.err(7536): at com.android.okhttp.internal.Platform.connectSocket(Platform.java:131)

04-19 19:42:02.462: W/System.err(7536): at com.android.okhttp.Connection.connect(Connection.java:101)

04-19 19:42:02.462: W/System.err(7536): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)

04-19 19:42:02.462: W/System.err(7536): at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)

04-19 19:42:02.462: W/System.err(7536): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)

04-19 19:42:02.462: W/System.err(7536): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)

04-19 19:42:02.462: W/System.err(7536): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)

04-19 19:42:02.462: W/System.err(7536): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)

04-19 19:42:02.462: W/System.err(7536): at com.payne.xiazai.MainActivity$2.run(MainActivity.java:73)

04-19 19:42:02.462: W/System.err(7536): Caused by: libcore.io.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)

04-19 19:42:02.462: W/System.err(7536): at libcore.io.IoBridge.isConnected(IoBridge.java:208)

04-19 19:42:02.462: W/System.err(7536): ... 14 more

04-19 19:42:02.612: I/Choreographer(1272): Skipped 32 frames! The application may be doing too much work on its main thread.

04-19 19:42:02.672: I/Choreographer(1272): Skipped 34 frames! The application may be doing too much work on its main thread.

04-19 19:42:58.203: I/Choreographer(1272): Skipped 40 frames! The application may be doing too much work on its main thread.

04-19 19:45:01.005: D/ConnectivityService(1272): Sampling interval elapsed, updating statistics ..

04-19 19:45:01.005: D/ConnectivityService(1272): Done.

04-19 19:45:01.005: D/ConnectivityService(1272): Setting timer for 720seconds

04-19 19:55:02.074: D/dalvikvm(1272): GC_FOR_ALLOC freed 610K, 17% free 5670K/6768K, paused 13ms, total 16ms

04-19 20:00:01.008: D/ConnectivityService(1272): Sampling interval elapsed, updating statistics ..

04-19 20:00:01.008: D/ConnectivityService(1272): Done.

04-19 20:00:01.008: D/ConnectivityService(1272): Setting timer for 720seconds

请问这是什么原因呢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值