多线程JAVA代码移植到android

public class MainActivity extends Activity {

protected static final int DOWN = 0;

protected static final int SEER = 1;

private Context context;

private EditText ed;

private ProgressBar pb;

public static int threadcount=3;

public static int runnling=3;

public int  cureatProcess=0;//当前进度

private Handler handler =new Handler(){

public void handleMessage(android.os.Message msg) {

switch (msg.what) {

case  DOWN:

Toast.makeText(getApplicationContext(), "下载错误", 0).show();

break;

case SEER:

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

break;

}

};

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ed=(EditText)findViewById(R.id.ed_path);

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

}

public void paly(View view){

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

if(TextUtils.isEmpty(path)){

Toast.makeText(getApplicationContext(), "请输入地址", 0).show();

return;

}

new Thread(){

public void run(){

//String path="http://down9.869v.com/setup_445.exe";

try {

URL url=new URL(path);

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

con.setReadTimeout(6000);

con.setRequestMethod("GET");

int code= con.getResponseCode();

if(code==200){

int length= con.getContentLength();//已经设置了请求的位置//返回的是当前位置对应文件的输入流

pb.setMax(length);//获取进度条最大值

RandomAccessFile raf=new RandomAccessFile((/"sdscard"/+"421.exe", "rwd");//记录当前线程下载的数据长度

raf.close();

//System.out.print("文件长度:"+length);

int bolak =length/threadcount;

for(int threadID=1;threadID<=threadcount;threadID++){

int starIndex=(threadID-1)*bolak;

int endIndex=threadID*bolak-1;

if(threadID==threadcount){

endIndex=length;

}

System.out.println("线程"+threadID+"下载---->"+starIndex+"----->"+endIndex);

new MyThread(path, threadID, starIndex, endIndex).start();

}

}else{

System.out.print("读取长度失败");

Message msg=new Message();

handler.sendMessage(msg);

msg.what=SEER;

}

} catch (Exception e) {

e.printStackTrace();

Message msg=new Message();

handler.sendMessage(msg);

msg.what=DOWN;

}

}

}.start();

}

public  class MyThread extends Thread{

public MyThread(String path, int threadID, int starIndex, int endIndex) {

super();

this.path = path;

this.threadID = threadID;

this.starIndex = starIndex;

this.endIndex = endIndex;

}

private String path;

private int threadID;

private int starIndex;

private int endIndex;

public void run(){

try {

//检查是否在记录下载长度的文件 如果存在读取这个文件的数据

File tempFile =new File(context.MODE_PRIVATE+threadID+".txt");

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

FileInputStream fis=new FileInputStream(tempFile);

byte[] tpem=new byte[1024];

int leng =fis.read(tpem);

String dowmlod =new String(tpem,0,leng);

int downlodalenInt= Integer.parseInt(dowmlod);

int alreadyDown =downlodalenInt-starIndex;

cureatProcess+=alreadyDown;//计算上次断点已经下载的值

starIndex=downlodalenInt;//修改下载的真实开始位置

fis.close();

}

URL url=new URL(path);

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

con.setRequestMethod("GET");

con.setRequestProperty("Range", "byte="+starIndex+"-"+endIndex);

System.out.println("线程真实下载位置"+threadID+"下载----"+starIndex);

con.setReadTimeout(8000);

int code=con.getResponseCode();

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

InputStream is= con.getInputStream();

RandomAccessFile raf=new RandomAccessFile((/"sdscard"/+"421.exe", "rwd");

raf.seek(starIndex);

int len=0;

byte[]buffer=new byte[1024];

int total=0;

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

RandomAccessFile flie =new RandomAccessFile((/"sdscard"/+threadID+".txt ","rwd");

raf.write(buffer,0,len);

total+=len;

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

flie.write((total+starIndex+"").getBytes());//记录下载的位置

flie.close();

synchronized (MainActivity.this) {

cureatProcess+=len;//记录当前总进度

pb.setProgress(cureatProcess);

}

}

is.close();

raf.close();

System.out.println("线程ID"+threadID+"下载完毕......");

} catch (Exception e) {

e.printStackTrace();

}finally{

threadFins();

}

}

private synchronized void threadFins() {

runnling--;

if(runnling==0){

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

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

file.delete();

}

System.out.println("文件下载半壁删除所有下载记录");

}

}

}

}

时间: 2024-07-28 12:20:28

多线程JAVA代码移植到android的相关文章

【转】java代码中实现android背景选择的selector-StateListDrawable的应用

原文网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0924/1712.html 下面的代码应该很多人都熟悉: 1 2 3 4 5 6 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">

java代码中实现android背景选择的selector-StateListDrawable的应用

首先定义一个获得StateListDrawable对象的方法: private StateListDrawable addStateDrawable(Context context, int idNormal, int idPressed, int idFocused) { StateListDrawable sd = new StateListDrawable(); Drawable normal = idNormal == -1 ? null : context.getResources()

一个简单的并非互相通讯的多线程 java代码

package datatypeSmp; public class threadtest { public static void main(String[] args) { salary sla = new salary(); new bossa(sla).start(); new bossb(sla).start(); }} class bossb extends Thread { salary ss = null; public bossb(salary s) { this.ss = s;

使用Phoenix将SQL代码移植至HBase

1.前言 HBase是云计算环境下最重要的NOSQL数据库,提供了基于Hadoop的数据存储.索引.查询,其最大的优点就是可以通过硬件的扩展从而几乎无限的扩展其存储和检索能力.但是HBase与传统的基于SQL语言的关系数据库无论从理念还是使用方式上都相去甚远,以至于要将基于SQL的项目移植到HBase时往往需要重写整个项目. 为了解决这个问题,很多开源项目提供了HBase的类SQL中间件,意即提供一种在HBase上使用的类SQL语言,使得程序员能够像使用关系数据库一样使用HBase,Apache

Android平台Java代码的条件编译问题

在代码的开发过程中,不管是C/C++也好,Java也罢,都要面对在平台移植的问题, 所以不可避免的要考虑条件编译的问题. 在C/C++代码的开发中,条件编译的实现很容易实现,可以分成二种:一种是在单个代码文件中通过 #ifdef ... #endif 或者 #if ... #endif 的方式选择性编译文件中的代码,另一种是在Makefile中通过宏判断来选择性编译某个文件.在Java代码的开发中,实现条件编译则没有直接对应的方法,但是仍然可以采用变通的方法来实现条件编译. 对于单个文件内的的代

Android平台下使用lua调用Java代码经验总结

动态语言以其执行的灵活性,可配置性.方便调试能够为开发带来极大的方便.假设用好了.能够极大的提高开发的效率. 怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的. 当中,lua以其小巧,灵活.方便扩展,方便嵌入被用于大多数的游戏开发中. 对于我来说.对于一个充分认识到动态的力量的人来说,在软件开发里集成一种脚本语言成为一种非常重要的非常有意义的工作. 可是在Android平台.在试过Python后,发现尽管集成也不是什么困难的事,可是感觉它还是有点大,一个动态库就有3M多,python库还

Android的WebView通过JS调用java代码

做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录,那么就会跳转到登录页面(登陆页面是另一个Activity).这个时候,一个简单的做法就是在按钮动作事件的js上调用java的方法,从而起到判断是否登录,并决定是否跳转到另一个页面. Google的WebView为我们提供了 addJavascriptInterface(Object obj, St

Android -- java代码设置margin

我们平常可以直接在xml里设置margin,如: <ImageView android:layout_margin="5dip" android:src="@drawable/image" /> 但是有些情况下,需要在java代码里来写,可是View本身没有setMargin方法,怎么办呢? 通过查阅android api,我们发现android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left,

【Android】Android Layout Binder——根据layout布局文件自动生成findViewById的java代码的神器

Android Layout Binder是一个网站,能够在线的根据layout布局文件自动生成findViewById的java代码. 网址是http://android.lineten.net/layout.php 如图: