请求时间失败:java.net.socketexception:协议不支持的地址族

时间:2011-09-04 18:07:27

标签: android

我到处都搜索过这个例外但是找不到分辨率&任何帮助,将不胜感激。 我已经尝试过设置断点,但是它们没有被击中,错误在log.v中也可见,而不是在log.e中。 该代码适用于前几次调用10-12次,然后变慢(开始失败并出现此错误),并最终每次都抛出此错误。

            _actionRunble = new Runnable() {
            public void run() {
                try{
                    ##..##
                     _imView.setImageBitmap(bmImg);
                     Drawable oldD = _imView.getBackground();
                     Drawable dd = new BitmapDrawable(bmImg);
                     _imView.setBackgroundDrawable(dd);
                     //(((BitmapDrawable)oldD).getBitmap()).recycle();
                     Thread t = new Thread(_r);
                     t.start();
                }catch(Exception e)
                {
                    e.printStackTrace();
                }
              }
           };
           _r = new Runnable() {
            @Override
            public void run() {
                downloadFile(imageUrl);
            }
           };
           Bitmap bmImg;
           void downloadFile(String fileUrl){
            URL myFileUrl =null;          
              try {
                   myFileUrl= new URL(fileUrl);
              } catch (MalformedURLException e) {
                   e.printStackTrace();
              }
              catch (Exception e) {
                   e.printStackTrace();
              }
              try {
                   HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
                   conn.setDoInput(true);
                   conn.connect();
                   InputStream is = conn.getInputStream();

                   bmImg = BitmapFactory.decodeStream(is);
                   //this.runOnUiThread(_actionRunble);
                   _mHandler.postDelayed(_actionRunble, 2000);
                   //_mHandler.postAtFrontOfQueue(_actionRunble);
                   //_mHandler.post(_actionRunble);
              } catch (IOException e) {
                   e.printStackTrace();
              }
              catch (Exception e) {
                   e.printStackTrace();
              }
         }

活动oncreate调用downloadfile(...)并在返回调用后再次使用相同的url调用以获取更新的映像。我尝试将主队列上的发布消息延迟2秒(虽然我不想要),但这也不起作用:(。 请随时进一步澄清。

2 个答案:

答案 0 :(得分:2)

我终于解决了。 为了特别摆脱这个异常,我开始使用单个HttpURLConnection(重用它直到它失败,你再次创建它),但我遇到了“BitmapFactory.decodeStream返回null”问题,同时做“bmImg = BitmapFactory .decodeStream(是); “这是因为我无法再次在同一个连接上使用相同的输入流,因此我必须在再次使用它之前关闭它(is.close(),in.close())。但是这个dint因为某些原因而起作用(我不知道!)。 最后,不是从HttpURLConnection获取输入流(使用conn.getInputStream()),而是直接从URL(myFileUrl.openStream())获取它。 BitmapFactory.decodeStream(是)有时仍然可以返回null(更好地处理那种情况 - 问我为什么:)),在这种情况下我再次尝试下载。 这里是更新的downloadFile(...)方法,希望它可以帮助某人:)

  void downloadFile(String fileUrl){
            URL myFileUrl =null;          
              try {
                   myFileUrl= new URL(fileUrl);
              } catch (MalformedURLException e) {
                  //print exception;
              }
              catch (Exception e) {
                  //print exception;
              }
              try {
                   //InputStream in = conn.getInputStream();--avoid this, get it from url directly instead, unless u really need to read from httpconnection because u want to configure headers or some other reason.
                   InputStream in = myFileUrl.openStream();
                   InputStream is = new BufferedInputStream(in);
                   bmImg = BitmapFactory.decodeStream(is);
                   in.close();
                   is.close();
                   if(bmImg==null)
                   {
                        downloadFile(fileUrl);
                        return;
                   }
                   //this.runOnUiThread(_actionRunble);
                   //_mHandler.postAtFrontOfQueue(_actionRunble);
                   //_mHandler.post(_actionRunble);
                   _mHandler.postDelayed(_actionRunble, 1000);
              }

             catch (IOException e) {
                  downloadFile(fileUrl);
                  //print exception;
              }
              catch (Exception e) {
                  downloadFile(fileUrl);
                  //print exception;
              }

         }

答案 1 :(得分:0)

您的问题出在imageUrl:它可能必须以 http https 开头,并且您要连接的实际服务器或主机名必须是要么是有效的IP地址,要么是名称 - 正确解析为IP地址。