點擊下載 程序崩潰
ThreadDAOImpl.java
package db;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import entities.ThreadInfo;
public class ThreadDAOImpl implements ThreadDAO{
private DBHelper mHelper=null;
public ThreadDAOImpl(Context context){
mHelper=new DBHelper(context);
}
@Override
public void insertThread(ThreadInfo threadInfo) {
// TODO Auto-generated method stub
SQLiteDatabase db=mHelper.getWritableDatabase();
db.execSQL(
"insert into thread_info(thread_id,url,start,end,finished) values(?,?,?,?,?)",
new Object[]{threadInfo.getId(),threadInfo.getUrl(),threadInfo.getStart(),threadInfo.getEnd(),threadInfo.getFinished()});
db.close();
}
@Override
public void deleteThread(String url, int thread_id) {
// TODO Auto-generated method stub
SQLiteDatabase db=mHelper.getWritableDatabase();
db.execSQL(
"delete from thread_info where url=? and thread_id=?",
new Object[]{url,thread_id});
db.close();
}
@Override
public void updateThread(String url, int thread_id, int finished) {
SQLiteDatabase db=mHelper.getWritableDatabase();
db.execSQL(
"update thread_info set finished=? where url=? and thread_id=?",
new Object[]{finished,url,thread_id});
db.close();
}
@Override
public List<ThreadInfo> getThreads(String url) {
SQLiteDatabase db=mHelper.getWritableDatabase();
List<ThreadInfo> list=new ArrayList<ThreadInfo>();
Cursor cursor=
db.rawQuery("select * from thread_info where url=?", new String[]{url});
while(cursor.moveToNext()){
ThreadInfo thread=new ThreadInfo();
thread.setId(cursor.getInt(cursor.getColumnIndex("thread_id")));
thread.setUrl(cursor.getString(cursor.getColumnIndex("url")));
thread.setStart(cursor.getInt(cursor.getColumnIndex("start")));
thread.setEnd(cursor.getInt(cursor.getColumnIndex("end")));
thread.setFinished(cursor.getInt(cursor.getColumnIndex("finished")));
list.add(thread);
}
cursor.close();
db.close();
return list;
}
@Override
public boolean isExists(String url, int thread_id) {
// TODO Auto-generated method stub
SQLiteDatabase db=mHelper.getWritableDatabase();
Cursor cursor=
db.rawQuery("select * from thread_info where url=? and thread_id=?",
new String[]{url,thread_id+""});
boolean exists=cursor.moveToNext();
cursor.close();
db.close();
return exists;
}
}
2016-07-27
DownloadTask.java
package services;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.http.HttpStatus;
import android.content.Context;
import android.content.Intent;
import android.os.Message;
import android.os.Messenger;
import db.ThreadDAO;
import db.ThreadDAOImpl;
import entities.FileInfo;
import entities.ThreadInfo;
public class DownloadTask {
private Context mContext = null;
private FileInfo mFileInfo = null;
private ThreadDAO mDao = null;
private int mFinished = 0;
public boolean isPause = false;
public DownloadTask(Context mContext, FileInfo mFileInfo) {
this.mContext = mContext;
this.mFileInfo = mFileInfo;
mDao = new ThreadDAOImpl(mContext);
}
public void download() {
List<ThreadInfo> threadInfos = mDao.getThreads(mFileInfo.getUrl());
ThreadInfo threadInfo = null;
if (threadInfos.size() == 0) {
threadInfo = new ThreadInfo(0, mFileInfo.getUrl(), 0, mFileInfo.getLength(), 0);
} else {
threadInfo = threadInfos.get(0);
}
new DownloadThread(threadInfo).start();
}
class DownloadThread extends Thread {
private ThreadInfo mThreadInfo = null;
public DownloadThread(ThreadInfo mThreadInfo) {
this.mThreadInfo = mThreadInfo;
}
public void run() {
if (!mDao.isExists(mThreadInfo.getUrl(), mThreadInfo.getId())) {
mDao.insertThread(mThreadInfo);
}
HttpURLConnection conn = null;
RandomAccessFile raf = null;
InputStream input = null;
try {
URL url = new URL(mThreadInfo.getUrl());
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setRequestMethod("GET");
int start = mThreadInfo.getStart() + mThreadInfo.getFinished();
conn.setRequestProperty("Range", "bytes=" + start + "-" + mThreadInfo.getEnd());
File file = new File(DownloadService.DOWNLOAD_PATH, mFileInfo.getFileName());
raf = new RandomAccessFile(file, "rwd");
raf.seek(start);
Intent intent = new Intent(DownloadService.ACTION_UPDATE);
mFinished += mThreadInfo.getFinished();
if (conn.getResponseCode() == HttpStatus.SC_PARTIAL_CONTENT) {
input = conn.getInputStream();
byte[] buffer = new byte[1024 * 4];
int len = -1;
long time = System.currentTimeMillis();
while ((len = input.read(buffer)) != -1) {
raf.write(buffer, 0, len);
mFinished += len;
if (System.currentTimeMillis() - time > 500) {
time = System.currentTimeMillis();
intent.putExtra("finished", mFinished * 100 / mFileInfo.getLength());
mContext.sendBroadcast(intent);
}
if (isPause) {
mDao.updateThread(mThreadInfo.getUrl(), mThreadInfo.getId(), mFinished);
return;
}
}
mDao.deleteThread(mThreadInfo.getUrl(), mThreadInfo.getId());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
raf.close();
conn.disconnect();
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}