Java 如何解决图片下载线程中的bug?
在我的代码中,首先我访问一个地址,然后得到文本文件。其中,有许多图片链接,例如。我使用正则表达式查找所有链接以生成arraylist。然后我使用下载服务下载所有图片。当我第一次按下按钮下载时,它可以成功运行。但如果再次按下该按钮并抛出错误,则该操作不起作用。我认为这个错误是关于线程的,但我不知道如何解决它Java 如何解决图片下载线程中的bug?,java,android,multithreading,download,threadpool,Java,Android,Multithreading,Download,Threadpool,在我的代码中,首先我访问一个地址,然后得到文本文件。其中,有许多图片链接,例如。我使用正则表达式查找所有链接以生成arraylist。然后我使用下载服务下载所有图片。当我第一次按下按钮下载时,它可以成功运行。但如果再次按下该按钮并抛出错误,则该操作不起作用。我认为这个错误是关于线程的,但我不知道如何解决它 HttpUtil.sendHttpRequest(address, new HttpCallbackListener() { @Ove
HttpUtil.sendHttpRequest(address,
new HttpCallbackListener() {
@Override
public void onFinish(String response) {
try {
ArrayList<String> urlList = new ArrayList<>();
Pattern p = Pattern.compile("http:.*?.com/(.*?.(jpg|png))");
Matcher m = p.matcher(response);
StringBuffer buffer = new StringBuffer();
while (m.find()) {
m.appendReplacement(buffer, "<T>" + + m.group(1) + "</T>");
urlList.add(m.group());
}
m.appendTail(buffer);
response = buffer.toString();
Message m2 = Message.obtain();
m2.obj = response;
m2.what = 1;
mHandler.sendMessage(m2);
new DownloadService("/data/data/com.baodian/files",
urlList,
new DownloadStateListener() {
@Override
public void onFinish() {
}
@Override
public void onFailed() {
}
}, context).startDownload();
;
// JSONObject singleChoice=all.getjson
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onError(Exception e) {
}
});
public class HttpUtil {
public static void sendHttpRequest(final String address,
final HttpCallbackListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection=null;
try {
URL url=new URL(address);
connection=(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in=connection.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(in,"gbk"));
StringBuilder response=new StringBuilder();
String line=null;
while ((line=reader.readLine())!=null) {
response.append(line);
}
if (listener!=null) {
listener.onFinish(response.toString());
}
} catch (Exception e) {
if (listener != null) {
listener.onError(e);
}
}
}
}).start();
}
}
HttpUtil.sendHttpRequest(地址,
新的HttpCallbackListener(){
@凌驾
公共void onFinish(字符串响应){
试一试{
ArrayList urlList=新的ArrayList();
Pattern p=Pattern.compile(“http:.*?.com/(.*?(jpg | png))”;
匹配器m=p.Matcher(响应);
StringBuffer=新的StringBuffer();
while(m.find()){
m、 附录替换(缓冲区“++m.group(1)+”);
添加(m.group());
}
m、 尾翼(缓冲器);
response=buffer.toString();
Message m2=Message.get();
m2.obj=响应;
m2.what=1;
mHandler.sendMessage(m2);
新的下载服务(“/data/data/com.baodian/files”,
URL列表,
新建DownloadStateListener(){
@凌驾
public void onFinish(){
}
@凌驾
public void onFailed(){
}
},上下文)。开始下载();
;
//JSONObject singleChoice=all.getjson
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
@凌驾
公共无效申报人(例外e){
}
});
公共类HttpUtil{
公共静态无效sendHttpRequest(最终字符串地址,
最终HttpCallbackListener(侦听器){
新线程(newrunnable()){
@凌驾
公开募捐{
HttpURLConnection=null;
试一试{
URL=新的URL(地址);
connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod(“GET”);
连接。设置连接超时(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(真);
InputStream in=connection.getInputStream();
BufferedReader=新的BufferedReader(新的InputStreamReader(以“gbk”为单位));
StringBuilder响应=新建StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
响应。追加(行);
}
if(侦听器!=null){
onFinish(response.toString());
}
}捕获(例外e){
if(侦听器!=null){
监听器。onError(e);
}
}
}
}).start();
}
}
如果你看看SimY4的答案, 他说,您得到的错误“意味着线程池很忙,队列也很满”。 当前要做的是在遇到错误时调用
onFailed
。你能做的就是实现
一种补充的封禁计划。您可以缓存较新的URL,直到线程队列具有空间、创建和排队
在那一点上的新线程
以下线程可能很有用:logcat消息在哪里?@ajantha我已经上传了图片中的所有代码