android socket 崩溃,Android:SocketTimeoutException:30000ms后无法连接到/103.24.4.60(端口80)...

我想从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 imageViews=Collections.synchronizedMap(new WeakHashMap());

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

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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值