Connection error handling

This commit is contained in:
Przemek Grondek 2014-08-21 15:17:36 +02:00
parent ba8b96c22e
commit d478b474fb
4 changed files with 66 additions and 24 deletions
app/src/main
java/info/nerull7/mysqlbrowser
res
values-pl
values

View file

@ -86,7 +86,7 @@ public class LoginFragment extends Fragment implements View.OnClickListener, Asy
url = urlTextbox.getText().toString(); url = urlTextbox.getText().toString();
if(Static.isNetworkConnected(getActivity())) { if(Static.isNetworkConnected(getActivity())) {
asyncDatabaseConnector = new AsyncDatabaseConnector(login, password, url); asyncDatabaseConnector = new AsyncDatabaseConnector(login, password, url, getActivity().getResources());
asyncDatabaseConnector.setBooleanReturnListener(this); asyncDatabaseConnector.setBooleanReturnListener(this);
asyncDatabaseConnector.setOnPostExecuteListener(this); asyncDatabaseConnector.setOnPostExecuteListener(this);
asyncDatabaseConnector.checkLogin(); asyncDatabaseConnector.checkLogin();

View file

@ -1,5 +1,6 @@
package info.nerull7.mysqlbrowser.db; package info.nerull7.mysqlbrowser.db;
import android.content.res.Resources;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
@ -12,12 +13,17 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import info.nerull7.mysqlbrowser.R;
/** /**
* Created by nerull7 on 07.07.14. * Created by nerull7 on 07.07.14.
* Database connector using Async calls * Database connector using Async calls
@ -39,6 +45,8 @@ public class AsyncDatabaseConnector {
private String database; private String database;
private final Resources resources;
private BooleanReturnListener booleanReturnListener; private BooleanReturnListener booleanReturnListener;
private IntegerReturnListener integerReturnListener; private IntegerReturnListener integerReturnListener;
private StringReturnListener stringReturnListener; private StringReturnListener stringReturnListener;
@ -48,10 +56,11 @@ public class AsyncDatabaseConnector {
public static String errorMsg; public static String errorMsg;
private OnPostExecuteListener onPostExecuteListener; private OnPostExecuteListener onPostExecuteListener;
public AsyncDatabaseConnector(String login, String password, String url){ public AsyncDatabaseConnector(String login, String password, String url, Resources resources){
this.login = login; this.login = login;
this.password = password; this.password = password;
this.url = url; this.url = url;
this.resources = resources;
booleanReturnListener=null; booleanReturnListener=null;
stringReturnListener=null; stringReturnListener=null;
@ -104,8 +113,9 @@ public class AsyncDatabaseConnector {
if(listReturnListener!=null) { if(listReturnListener!=null) {
listReturnListener.onListReturn(list); listReturnListener.onListReturn(list);
} }
errorMsg = error;
} }
}, onPostExecuteListener); }, onPostExecuteListener, resources);
downloader.execute(urlQuery); downloader.execute(urlQuery);
} }
@ -119,8 +129,9 @@ public class AsyncDatabaseConnector {
} catch (JSONException e) { e.printStackTrace(); } } catch (JSONException e) { e.printStackTrace(); }
if(matrixReturnListener!=null) if(matrixReturnListener!=null)
matrixReturnListener.onMatrixReturn(list); matrixReturnListener.onMatrixReturn(list);
errorMsg = error;
} }
}, onPostExecuteListener); }, onPostExecuteListener, resources);
downloader.execute(urlQuery); downloader.execute(urlQuery);
} }
@ -161,10 +172,9 @@ public class AsyncDatabaseConnector {
errorMsg = data; errorMsg = data;
listenerData = false; listenerData = false;
} }
booleanReturnListener.onBooleanReturn(listenerData); booleanReturnListener.onBooleanReturn(listenerData);
} }
}, onPostExecuteListener); }, onPostExecuteListener, resources);
downloader.execute(actionUrlBuilder(ACTION_LOGIN)); downloader.execute(actionUrlBuilder(ACTION_LOGIN));
return false; return false;
} }
@ -226,8 +236,9 @@ public class AsyncDatabaseConnector {
public void onFinished(String data, String error) { public void onFinished(String data, String error) {
if(integerReturnListener!=null) if(integerReturnListener!=null)
integerReturnListener.onIntegerReturn(Integer.parseInt(data)); integerReturnListener.onIntegerReturn(Integer.parseInt(data));
errorMsg = error;
} }
}, onPostExecuteListener); }, onPostExecuteListener, resources);
downloader.execute(urlQuery); downloader.execute(urlQuery);
} }
@ -280,8 +291,9 @@ public class AsyncDatabaseConnector {
if(stringReturnListener!=null){ if(stringReturnListener!=null){
stringReturnListener.onStringReturn(data); stringReturnListener.onStringReturn(data);
} }
errorMsg = error;
} }
}, onPostExecuteListener); }, onPostExecuteListener, resources);
downloader.execute(request); downloader.execute(request);
} }
@ -321,8 +333,9 @@ public class AsyncDatabaseConnector {
if(stringReturnListener!=null){ if(stringReturnListener!=null){
stringReturnListener.onStringReturn(data); stringReturnListener.onStringReturn(data);
} }
errorMsg = error;
} }
}, onPostExecuteListener); }, onPostExecuteListener, resources);
downloader.execute(request); downloader.execute(request);
} }
@ -378,14 +391,16 @@ public class AsyncDatabaseConnector {
private OnFinishedListener onFinishedListener; private OnFinishedListener onFinishedListener;
private OnPostExecuteListener onPostExecuteListener; private OnPostExecuteListener onPostExecuteListener;
private String errorString; private String errorString;
private Resources resources;
public static final String CONNECTION_REQUEST_METHOD = "GET"; public static final String CONNECTION_REQUEST_METHOD = "GET";
public static final int CONNECTION_TIMEOUT = 15000; public static final int CONNECTION_TIMEOUT = 15000;
public static final int READ_TIMEOUT = 10000; public static final int READ_TIMEOUT = 10000;
Downloader(OnFinishedListener onFinishedListener, OnPostExecuteListener onPostExecuteListener){ Downloader(OnFinishedListener onFinishedListener, OnPostExecuteListener onPostExecuteListener, Resources resources){
this.onFinishedListener = onFinishedListener; this.onFinishedListener = onFinishedListener;
this.onPostExecuteListener = onPostExecuteListener; this.onPostExecuteListener = onPostExecuteListener;
this.resources = resources;
errorString = null; errorString = null;
} }
@ -400,22 +415,42 @@ public class AsyncDatabaseConnector {
urlConnection.setReadTimeout(READ_TIMEOUT); urlConnection.setReadTimeout(READ_TIMEOUT);
urlConnection.setConnectTimeout(CONNECTION_TIMEOUT); urlConnection.setConnectTimeout(CONNECTION_TIMEOUT);
urlConnection.setRequestMethod(CONNECTION_REQUEST_METHOD); urlConnection.setRequestMethod(CONNECTION_REQUEST_METHOD);
urlConnection.connect();
if(urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { try {
try { urlConnection.connect();
inputStream = urlConnection.getInputStream();
response = readStream(inputStream); if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
} finally { try {
if(inputStream!=null) inputStream = urlConnection.getInputStream();
inputStream.close(); response = readStream(inputStream);
urlConnection.disconnect(); } finally {
if (inputStream != null)
inputStream.close();
urlConnection.disconnect();
}
return response;
} else {
errorString = "ERROR " + urlConnection.getResponseCode() + ": " + urlConnection.getResponseMessage();
} }
return response; } catch (Exception e) {
parseException(e);
} }
else { return null;
errorString = "ERROR "+urlConnection.getResponseCode()+": "+urlConnection.getResponseMessage(); }
return null;
private void parseException(Exception e){
if(e instanceof SocketException){
if(e.getMessage().contains("ECONNREFUSED")) {
errorString = resources.getString(R.string.error_connection_refused);
} else if(e.getMessage().contains("EHOSTUNREACH")) {
errorString = resources.getString(R.string.error_connection_unreachable);
} else {
errorString = "Exception: " + e.getClass();
}
} else if (e instanceof SocketTimeoutException){
errorString = resources.getString(R.string.error_connection_timeout);
} else {
errorString = "Exception: " + e.getClass();
} }
} }
@ -440,7 +475,7 @@ public class AsyncDatabaseConnector {
protected String doInBackground(String... strings) { protected String doInBackground(String... strings) {
try { try {
String data = httpRequest(strings[0]); String data = httpRequest(strings[0]);
onFinishedListener.onFinished(data, errorMsg); // Can't be null cos we demand listener in constructor onFinishedListener.onFinished(data, errorString); // Can't be null cos we demand listener in constructor
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View file

@ -37,6 +37,9 @@
<string name="error_no_databases">Brak dostępnych baz</string> <string name="error_no_databases">Brak dostępnych baz</string>
<string name="error_no_save">Twoje dane <b>NIE</b> zostaną zapisane! Czy chciałbyś kontynuować?</string> <string name="error_no_save">Twoje dane <b>NIE</b> zostaną zapisane! Czy chciałbyś kontynuować?</string>
<string name="error_remove">Ten wpis zostanie usunięty z bazy. Tej akcji <b>NIE MOŻNA</b> cofnąć! Czy chciałbyś kontynuować?</string> <string name="error_remove">Ten wpis zostanie usunięty z bazy. Tej akcji <b>NIE MOŻNA</b> cofnąć! Czy chciałbyś kontynuować?</string>
<string name="error_connection_timeout">Przekroczono czas połączenia</string>
<string name="error_connection_reset">Połączenie zostało zrestartowane</string>
<string name="error_connection_unreachable">No route to host</string>
<string name="pref_entries_per_page">Ustaw limit wpisów na stronę</string> <string name="pref_entries_per_page">Ustaw limit wpisów na stronę</string>
<string name="login_settings">Poświadczenia logowania</string> <string name="login_settings">Poświadczenia logowania</string>

View file

@ -43,6 +43,10 @@
<string name="error_no_databases">No available databases</string> <string name="error_no_databases">No available databases</string>
<string name="error_no_save">Your data will <b>NOT</b> be saved! Would you like to continue?</string> <string name="error_no_save">Your data will <b>NOT</b> be saved! Would you like to continue?</string>
<string name="error_remove">This entry will be removed from database. This action <b>CAN NOT</b> be reversed! Would you like to continue?</string> <string name="error_remove">This entry will be removed from database. This action <b>CAN NOT</b> be reversed! Would you like to continue?</string>
<string name="error_connection_timeout">Connection timeout</string>
<string name="error_connection_reset">Connection reset by peer</string>
<string name="error_connection_refused">Connection refused</string>
<string name="error_connection_unreachable">No route to host</string>
<string name="pref_entries_per_page">Set number of entries per page</string> <string name="pref_entries_per_page">Set number of entries per page</string>
<string name="login_settings">Login credentials</string> <string name="login_settings">Login credentials</string>