2015-09-30 11 views
5

Desidero scaricare l'immagine dall'URL Http e salvarla nella scheda SD dopo il caricamento e mostrare nella vista dell'immagine. Ho provato tutorial di Image-loader da Android-hive usato il mio URL http per caricare l'immagine ma dopo l'immagine di esecuzione non può caricare e mostrare. App non è in crash ma ottenere un'eccezione errore java.net.SocketTimeoutException: failed to connect to /103.24.4.60 (port 80) after 30000ms in ImageLoader classeAndroid: SocketTimeoutException: impossibile connettersi a /103.24.4.60 (porta 80) dopo 30000 ms

Ecco le informazioni del registro

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) 

Questa è classe 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), 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(); 
    } 

} 
+1

quanto grande è l'immagine? Ci sono voluti 30 secondi per il timeout, possibile che l'immagine sia troppo grande o che tu abbia una bassa velocità internet. – NaviRamyle

+0

La dimensione dell'immagine è 4568 per 6987 – androidTag

+1

Questo è troppo grande e l'app probabilmente avrà un errore di memoria insufficiente. È possibile ridimensionare l'immagine in una scala più sicura – NaviRamyle

risposta

9

Ci sono due possibilità: 1) hanno hai controllato e testato la tua connessione.

2) meglio non impostare alcun timeout di connessione, se si imposta il tempo massimo scelto ,, perché genera un errore, se il server non ha risposto entro un determinato periodo di tempo.

in modo da poter utilizzare

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

oppure è possibile utilizzare

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     


    } 
} 

speranza in modo da esso vi aiuta, godono il codice :)

+0

Grazie funziona perfettamente, possiamo scaricare mp3 utilizzando ImageLoader – androidTag

0

Il problema è stato risolto quando il mio telefono era connesso al server wifi locale in cui erano ospitati i servizi web.

-1

Questo problema può verificarsi a causa di firewall, si prega di controllare i passaggi qui sotto per risolverla

  1. Verificare se è possibile connettersi direttamente tramite URL, utilizzando uno dei del browser, invece di Android.
  2. Se non riesce, potrebbe trattarsi di un problema con connettività di rete non con codice Android.
  3. Uno dei motivi alla base dell'errore di connessione di rete è l'opzione "FIREWALL", che potrebbe bloccare la richiesta di connessione.
  4. In caso di macchina MAC, aprire "Preferenze di sistema ==> Sicurezza & Privacy ==> Firewall ==> Disattiva firewall". Girerà su FIREWALL sul sistema.
  5. In caso di altri sistemi operativi, disattivare FIREWALL con le rispettive impostazioni.

Ora si dovrebbe essere in grado di connettersi tramite il codice così diretto attraverso il browser, quindi non ci sarà alcun errore "SocketTimeoutException". In bocca al lupo.

0

Ho anche avuto questo problema. Nel mio caso, stavo cercando di connettere la mia app Android con il nodo REST api che era in esecuzione sulla porta 3000. Avevo anche questo problema di timeout della connessione. Il mio sistema operativo è Windows.

Seguire questi passaggi.

1) - Controllare se il cellulare e il computer siano collegati alla stessa rete

2) -Controllare l'IP del computer assegnato dal router utilizzando sotto COMAND sul cmd

ipconfig 

Il risultato sarà così

Windows IP Configuration 

    Wireless LAN adapter Wi-Fi: 

    Connection-specific DNS Suffix . : 
    Link-local IPv6 Address . . . . . : ******** 
    IPv4 Address. . . . . . . . . . . : ******** 
    Subnet Mask . . . . . . . . . . . : ******** 
    Default Gateway . . . . . . . . . : ******** 
            ***.***.8.1 

Quindi controllare l'indirizzo IP utilizzato. Deve essere Indirizzo IPv4 della rete wifi collegato

3) -Imposta la rete come rete privata/Casa

Su I finestrini 10, è possibile farlo da selezionare barra delle applicazioni wifi icona = => selecte le proprietà di rete collegata ==> Sotto il profilo di rete impostare la rete come privata

4) -Controllare che il Firewall sia disabilitato.

Se il firewall è attivato si prega di spegnere fino a fine prova e ricordarsi di accendere di nuovo dopo aver terminato il vostro compito

Problemi correlati