andreascarlssonMedlem sedan feb. 2003211 inlägg
Jag har en metod som kollar om en URL fungerar och svarar med rätt statuskod (200).
-------------------------------------------------------------------------------
public static boolean isValidUrl(String linkUrl)
{
if(linkUrl.equals(null) || linkUrl.equals(""))
return false;
URL url;
HttpURLConnection urlConn;
try
{
url = new URL(linkUrl);
urlConn = (HttpURLConnection)url.openConnection();
if(HttpURLConnection.HTTP_OK != urlConn.getResponseCode())
return false;
} catch(Exception e){return false;}
return true;
}
-------------------------------------------------------------------------------
Nu är det ju så att alla servrar (url:er) inte är så värst snabba på att svara... :-(
Finns det då något sätt att avbryta funktionen?? Så att man slipper vänta 2 minuter på att denna funktion skall köra färdigt (ifall någon site skulle känna för att strunta i att svara på detta anrop).
Alltså någon slags timerfunktion, som håller koll på att det inte gått mer än t.ex. 3 sekunder. Om det har gått mer än 3 sekunder så skall metoden returnera false... typ!
Finns det någon som har en idé... För mig står det helt stilla just nu! :-)
phonkworksMedlem sedan juli 2001228 inlägg
Detta borde funka.
He he, kan verka lite meckigt men jag är barnsligt förtjust i anonyma klasser.
public static boolean isValidUrl(final String linkUrl,int timeout)
{
if(linkUrl.equals(null) || linkUrl.equals("")) return false;
final boolean[] isValid = new boolean[1];
try {
Thread t = new Thread(
new Runnable() {
public void run() {
URL url;
HttpURLConnection urlConn;
try
{
url = new URL(linkUrl);
urlConn = (HttpURLConnection)url.openConnection();
if(HttpURLConnection.HTTP_OK == urlConn.getResponseCode())
isValid[0] = true;
} catch(Exception e){ }
}
}
);
t.start();
t.join(timeout);
}
catch(Exception e){ }
return isValid[0];
}
mvh
phonk
andreascarlssonMedlem sedan feb. 2003211 inlägg
Funkar klockrent!!! Tackar!!! :-)
En liten fråga bara... Varför använde du en array av typen boolean, istället för att endast deklarera en variabel av typen boolean?? *Nyfiken* :-)
Sedan undrar jag varför du deklarerade argumentet "linkUrl" som en final String??? Det finns säkert en jättebra anledning, men jag är ju ingen Javagud direkt.... :-)
Tack än en gång!!!
phonkworksMedlem sedan juli 2001228 inlägg
Jo, en anonym klass(innre klasser) har bara tillgång till metodvariabler som är final. Detta pga av att en instans av en innre klass har möjlighet att "leva" längre än metoden den ligger i och eftersom metodvariabler dör när metoden returnerar skulle det kunna stöka till det ordentligt.
Tricket är att man kan deklarera ett objekt som final men innehållet behöver ju inte vara final. Mao, man får inte tilldela objektreferensen en ny objekt-instans men det är helt ok att förändra innehållet.
Samma sak med linkUrl, den måste vara final för att den innre klassen ska få tillgång till den.
mvh
phonk
andreascarlssonMedlem sedan feb. 2003211 inlägg
Ok!
Tack för lektionen!! :-)