Mam tutaj funkcję, która pobiera dane ze zdalnego serwera do pliku. Nadal nie jestem pewien z moim kodem. Moje pytanie brzmi: co jeśli czytając strumień i zapisując dane do pliku i nagle zostałem odłączony w Internecie, czy te wyjątki poniżej złapią taki rodzaj incydentu? Jeśli nie, czy możesz zasugerować, jak poradzić sobie z tego rodzaju incydentem?Android: obsłużyć nieoczekiwany dostęp do Internetu podczas pobierania danych
Uwaga: tę funkcję nazywam w wątku, aby interfejs użytkownika nie był blokowany.
public static boolean getFromRemote(String link, String fileName, Context context){
boolean dataReceived = false;
ConnectivityManager connec = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connec.getNetworkInfo(0).isConnected() || connec.getNetworkInfo(1).isConnected()){
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(link);
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 30000);
HttpConnectionParams.setSoTimeout(params, 30000);
HttpResponse response;
response = httpClient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200){
HttpEntity entity = response.getEntity();
InputStream in = null;
OutputStream output = null;
try{
in = entity.getContent();
String secondLevelCacheDir = context.getCacheDir() + fileName;
File imageFile = new File(secondLevelCacheDir);
output= new FileOutputStream(imageFile);
IOUtilities.copy(in, output);
output.flush();
} catch (IOException e) {
Log.e("SAVING", "Could not load xml", e);
} finally {
IOUtilities.closeStream(in);
IOUtilities.closeStream(output);
dataReceived = true;
}
}
}catch (SocketTimeoutException e){
//Handle not connecting to client !!!!
Log.d("SocketTimeoutException Thrown", e.toString());
dataReceived = false;
} catch (ClientProtocolException e) {
//Handle not connecting to client !!!!
Log.d("ClientProtocolException Thrown", e.toString());
dataReceived = false;
}catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
dataReceived = false;
Log.d("MalformedURLException Thrown", e.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
dataReceived = false;
Log.d("IOException Thrown", e.toString());
}
}
return dataReceived;
}
Czy możesz podać jakiś przykład, w jaki sposób stworzyć DefaultThreadHandler? Nie mam doświadczenia w tworzeniu tego. Dzięki. – capecrawler
Nie użyłem ich samodzielnie w kodzie (znam je tylko w teorii), ale myślę, że ich używanie jest całkiem proste. Redagowałem powyższą odpowiedź; Spójrz. – Samuh