Java 如何解决图片下载线程中的bug?

Java 如何解决图片下载线程中的bug?,java,android,multithreading,download,threadpool,Java,Android,Multithreading,Download,Threadpool,在我的代码中,首先我访问一个地址,然后得到文本文件。其中,有许多图片链接,例如。我使用正则表达式查找所有链接以生成arraylist。然后我使用下载服务下载所有图片。当我第一次按下按钮下载时,它可以成功运行。但如果再次按下该按钮并抛出错误,则该操作不起作用。我认为这个错误是关于线程的,但我不知道如何解决它 HttpUtil.sendHttpRequest(address, new HttpCallbackListener() { @Ove

在我的代码中,首先我访问一个地址,然后得到文本文件。其中,有许多图片链接,例如。我使用正则表达式查找所有链接以生成arraylist。然后我使用下载服务下载所有图片。当我第一次按下按钮下载时,它可以成功运行。但如果再次按下该按钮并抛出错误,则该操作不起作用。我认为这个错误是关于线程的,但我不知道如何解决它

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我已经上传了图片中的所有代码