I want to download image from Http url and save into sd card after that load and show into image view. I have tried Image-loader tutorial from android-hive used my http url for load the image but after run image can't load and show. App is not crash but getting error exception java.net.SocketTimeoutException: failed to connect to /103.24.4.60 (port 80) after 30000ms
in ImageLoader class
Here is my Log information
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)
This is ImageLoader class
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), null, 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();
}
}
There are two possibilities:
1) Have you checked and tested your connection.
2) Better don't set any connection timeout,if you are setting chose maximum time, because it throws an error,if server didn't response within given time.
so you can use:
HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(7000);
or you can use:
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
}
}
hope so it will helps you, enjoy your code :)
I also had this problem. In my case, I was trying to connect my Android app with node REST api which was running on port 3000. I also had this connection timeout problem. My OS is windows.
Folow these steps.
1)- Check whether the mobile and Computer are connected to same network
2)-Check the computer IP assigned by router using below comand on cmd
ipconfig
The result will be like this
Windows IP Configuration
Wireless LAN adapter Wi-Fi:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : ********
IPv4 Address. . . . . . . . . . . : ********
Subnet Mask . . . . . . . . . . . : ********
Default Gateway . . . . . . . . . : ********
***.***.8.1
Then check the used IP address. It must be IPv4 Address of the connected wifi network
3)-Set the network as private/ Home network
On windoes 10, you can do this by select taskbar wifi icon ==> selecte the properties of connected network ==> Under Network profile set the network as private
4)-Check the Firewall is disabled.
If your firewall is enabled please turn off it until test finish and remember to turn on it again after finishing your task
This issue can occur due to FIREWALL, please check below steps to resolve it
Now you should be able to connect through code as well direct through browser, hence there won't be any "SocketTimeoutException" error. Good Luck.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With