我想从Http url下载图像并在加载后保存到SD卡并显示到图像视图中.我试过从 android-hive的 Image-loader教程使用我的http url加载图像,但运行后的图像无法加载和显示.应用程序没有崩溃,但获得错误异常java.net.socketTimeoutException:在ImageLoader类30000ms后无法连接到/103.24.4.60(端口80)

这是我的日志信息

09-30 02:32:15.820  18371-18389/? W/System.err﹕ java.net.socketTimeoutException: Failed to connect to /103.24.4.60 (port 80) after 30000ms
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:169)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.net.socket.connect(Socket.java:882)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.Platform.connectSocket(Platform.java:139)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:148)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.example.tazeen.imgloader.ImageLoader.getBitmap(ImageLoader.java:73)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.example.tazeen.imgloader.ImageLoader.access$000(ImageLoader.java:23)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.example.tazeen.imgloader.ImageLoader$Photosloader.run(ImageLoader.java:134)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-30 02:32:15.821  18371-18389/? W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-30 02:32:15.821  18371-18389/? W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-30 02:32:15.821  18371-18389/? W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

这是ImageLoader类

public class ImageLoader {

    MemoryCache memoryCache=new MemoryCache();
    FileCache fileCache;
    private Map<ImageView,String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView,String>());
    ExecutorService executorService; 

    public ImageLoader(Context context){
        fileCache=new FileCache(context);
        executorService=Executors.newFixedThreadPool(5);
    }

    int stub_id = R.drawable.ic_launcher;
    public void displayImage(String url,int loader,ImageView imageView)
    {
        stub_id = loader;
        imageViews.put(imageView,url);
        Bitmap bitmap=memoryCache.get(url);
        if(bitmap!=null)
            imageView.setimageBitmap(bitmap);
        else
        {
            queuePhoto(url,imageView);
            imageView.setimageResource(loader);
        }
    }

    private void queuePhoto(String url,ImageView imageView)
    {
        PhotoToLoad p=new PhotoToLoad(url,imageView);
        executorService.submit(new Photosloader(p));
    }

    private Bitmap getBitmap(String url)
    {
        File f=fileCache.getFile(url);

        //from SD cache
        Bitmap b = decodeFile(f);
        if(b!=null)
            return b;

        //from web
        try {
            Bitmap bitmap=null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is=conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.copyStream(is,os);
            os.close();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Exception ex){
           ex.printstacktrace();
           return null;
        }
    }

    //decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f){
        try {
            //decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f),null,o);

            //Find the correct scale value. It should be the power of 2.
            final int required_SIZE=70;
            int width_tmp=o.outWidth,height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<required_SIZE || height_tmp/2<required_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }

            //decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeStream(new FileInputStream(f),o2);
        } catch (FileNotFoundException e) {}
        return null;
    }

    //Task for the queue
    private class PhotoToLoad
    {
        public String url;
        public ImageView imageView;
        public PhotoToLoad(String u,ImageView i){
            url=u;
            imageView=i;
        }
    }

    class Photosloader implements Runnable {
        PhotoToLoad photoToLoad;
        Photosloader(PhotoToLoad photoToLoad){
            this.photoToLoad=photoToLoad;
        }

        @Override
        public void run() {
            if(imageViewReused(photoToLoad))
                return;
            Bitmap bmp=getBitmap(photoToLoad.url);
            memoryCache.put(photoToLoad.url,bmp);
            if(imageViewReused(photoToLoad))
                return;
            Bitmapdisplayer bd=new Bitmapdisplayer(bmp,photoToLoad);
            Activity a=(Activity)photoToLoad.imageView.getContext();
            a.runOnUiThread(bd);
        }
    }

    boolean imageViewReused(PhotoToLoad photoToLoad){
        String tag=imageViews.get(photoToLoad.imageView);
        if(tag==null || !tag.equals(photoToLoad.url))
            return true;
        return false;
    }

    //Used to display bitmap in the UI thread
    class Bitmapdisplayer implements Runnable
    {
        Bitmap bitmap;
        PhotoToLoad photoToLoad;
        public Bitmapdisplayer(Bitmap b,PhotoToLoad p){bitmap=b;photoToLoad=p;}
        public void run()
        {
            if(imageViewReused(photoToLoad))
                return;
            if(bitmap!=null)
                photoToLoad.imageView.setimageBitmap(bitmap);
            else
                photoToLoad.imageView.setimageResource(stub_id);
        }
    }

    public void clearCache() {
        memoryCache.clear();
        fileCache.clear();
    }

}

解决方法

有两种可能性:
1)您检查并测试了您的连接.

2)最好不要设置任何连接超时,如果你设置选择最大时间,因为如果服务器在给定时间内没有响应它会抛出错误.

所以你可以使用

HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(7000);

或者你可以使用

for (int retries = 0; retries < 3; retries++) {
try {
    final HttpClient client = createHttpClientWithDefaultSocketFactory(null,null);
    final HttpResponse response = client.execute(get);
    final int statusCode = response.getStatusLine().getStatusCode();
    if (statusCode != 200) {
        throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode);
    } else {                
        return response.getEntity();
    }
} catch (final java.net.socketTimeoutException e) {
    // connection timed out...let's try again                


   }
}

希望所以它会帮助你,享受你的代码:)

Android:SocketTimeoutException:30000ms后无法连接到/103.24.4.60(端口80)的更多相关文章

  1. 将设备升级到iOS12后应用程序崩溃

    我的企业应用程序工作正常,直到iOS11.昨天,我将其中一个设备更新到iOS12并测试了该应用程序.它在发布时崩溃了.调试时我发现它在Simulator上工作正常,但在调用main之前就崩溃了.崩溃日志已经通过Apple开发者论坛和其他堆栈溢出崩溃.但到目前为止还没有指针.任何帮助或指示表示赞赏.解决方法我的应用程序崩溃了旧版的CrittercismiOSSDK.

  2. 企业(内部)Swift应用程序在iOS9上推出后退出

    我们发现我们的内部证书签署的Swift应用程序无法在iOS9上运行,而在iOS8上正常运行.我们已经信任开发人员的设置–>一般–>配置文件,但是当我们尝试启动应用程序时,它会卡在启动屏幕上,然后退出.我们从日志中没有任何线索.它只告诉它在20时之后没能启动.我怀疑这是一个与签约有关的问题.因为当我使用AdHoc证书签署应用程序时,在iOS9上运行没有问题.没有人知道发生了什么吗?

  3. android – ListView – ImageLoader在向上滚动时移动列表/项目

    解决方法请,请,请不要“重新发明轮子”并使用任何lib来进行图像加载,缓存等,如Picasso,Fresco,Glide等…

  4. 添加ImageLoader时,getInstance(this)中的Android Volley错误

    ..有什么帮助吗?

  5. android – 结合CoverFlow和通用图像加载器

    我正在使用fancyCoverFlow和universalImageLoader来显示我的自定义3D图库:D类似下图.我的问题是它没有在下载时显示图像,除非我在画廊图片之间滑动并且该图片在屏幕上隐藏并且在下次显示图像时出现但是在UniversalImageLoader的示例中,下载的图像在下载后立即显示.这是我的适配器的getView代码:它与UniversalImageLoader完全相同Sam

  6. Android:SocketTimeoutException:30000ms后无法连接到/103.24.4.60(端口80)

    我想从Httpurl下载图像并在加载后保存到SD卡并显示到图像视图中.我试过从android-hive的Image-loader教程使用我的httpurl加载图像,但运行后的图像无法加载和显示.应用程序没有崩溃,但获得错误异常java.net.socketTimeoutException:在ImageLoader类30000ms后无法连接到/103.24.4.60(端口80)这是我的日志信息这是I

  7. android – 使用NetworkImageView时的OOM(Volley库)

    背景使用Volleylibrary的NetworkImageView是处理从网络显示图像的便捷方式.但是,它有一些错误.问题使用它可以获得的一个问题是它不能以内存有效的方式解码来自Web的图像.这意味着如果你在其中使用带有多个NetworkImageView的gridView,并且每个都显示一个具有未知分辨率的图像,那么你最终会得到一个OOM.例如,您可以将此对象的url设置为thisone,并自己查看应用程序在显示位图后使用了多少内存,与之前使用的内容相比.这个问题我如何修改NetworkImageVi

  8. Android应用程序:SocketException权限被拒绝(没有这样的文件或目录)

    我试图使用Fedor在这个帖子中发布的代码和上传的代码LazyloadofimagesinListView(源码:http://open-pim.com/tmp/LazyList.zip)Fedor的项目运行良好,但是当我尝试将代码调整到我的项目时,由于我碰到了这个异常(SocketException),所以事情运行得不好.不知何故,即使在清单中设置权限以获得Internet权限之后,我仍然继续获

  9. ios – 将MH_EXECUTE转换为MH_DYLIB(mach-o)

    问题:我有2个MH_EXECUTEiOS二进制文件.让我们将它们命名为binary1和binary2.在调用UIApplicationMain之前,我尝试在它们之间切换!运行binary1后,我得到格式错误的mach-o图像:segment__PAGEZERO重叠加载命令第4步我成功地从加载命令中删除了__PAGEZERO二进制看起来像dylib:fullscreen但是在启动binary1时我得到了BAD_ACCESS任何的想法???解决方法您正在获取BAD_ACCESS,因为您删除了__PAGEZER

  10. java – 图像未被缓存在本地(使用通用图像加载程序) – 缓慢的图像加载时间

    你还缓存到磁盘?

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部