Avere alcuni problemi con una classe personalizzata che estende AsyncTask. La mia app è Targeting per Android 4.0.3 e il codice seguente funziona correttamente per oltre 30 persone che lo testano. Tuttavia, ci sono due utenti che stanno vedendo l'arresto anomalo dell'app quando chiamo nuovo AsyncRequest come di seguito.La creazione di AsyncTask provoca l'arresto anomalo
Ho un logger funzionante che registra su un file di testo nella memoria degli utenti e non registra la voce che si trova nel costruttore AsyncRequest. Quindi devo supporre che l'arresto si verifichi prima che venga chiamato il costruttore.
Uno dei due dispositivi in cui si verifica questo arresto anomalo sta eseguendo Android 4.0.4 a quanto pare. Non sei sicuro di cosa stia funzionando l'altro dispositivo. Sfortunatamente non ho accesso ai due dispositivi, quindi non posso vedere un output logcat.
Qualsiasi input sul motivo per cui la creazione dell'oggetto sta causando un arresto anomalo sarebbe molto apprezzato.
String url = "www.google.com";
new AsyncRequest(callback, context).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
E qui è la classe completa AsyncRequest
public class AsyncRequest extends AsyncTask<String, String, String>{
HttpURLConnection connection;
InputStream inStream;
IApiCallback callback;
Context context_;
public AsyncRequest(IApiCallback callback, Context context) {
// Log entry added for testing. Never gets called.
FileLogger.getFileLogger(context).ReportInfo("Enter AsyncRequest Constructor");
this.callback = callback;
context_ = context;
}
@Override
protected String doInBackground(String... uri) {
try {
URL url = new URL(uri[0] + "?format=json");
FileLogger.getFileLogger(context_).ReportInfo("Async Request: Sending HTTP GET to " + url);
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.addRequestProperty("Accept-Encoding", "gzip");
connection.addRequestProperty("Cache-Control", "no-cache");
connection.connect();
String encoding = connection.getContentEncoding();
// Determine if the stream is compressed and uncompress it if needed.
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {
inStream = new GZIPInputStream(connection.getInputStream());
} else {
inStream = connection.getInputStream();
}
if (inStream != null) {
// process response
BufferedReader br = new BufferedReader(new InputStreamReader(inStream));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
} catch (SocketTimeoutException e) {
FileLogger.getFileLogger(context_).ReportException("Async Request: SocketTimeoutException", e);
Log.i("AsyncRequest", "Socket Timeout occured");
} catch (MalformedURLException e) {
FileLogger.getFileLogger(context_).ReportException("Async Request: MalformedUrlException", e);
} catch (IOException e) {
FileLogger.getFileLogger(context_).ReportException("Async Request: IOException", e);
Log.i("doInBackground:","IOException");
if (e != null && e.getMessage() != null) {
Log.i("doInBackground:",e.getMessage());
}
} catch (Exception e) {
FileLogger.getFileLogger(context_).ReportException("Async Request: Exception", e);
} finally {
if (connection != null)
connection.disconnect();
}
return null;
}
@Override
protected void onPostExecute(String result) {
if (result != null)
FileLogger.getFileLogger(context_).ReportInfo("Async Request: Response is valid");
else
FileLogger.getFileLogger(context_).ReportInfo("Async Request: Invalid response");
callback.Execute(result);
}
}
EDIT: Come da commenti qui sotto.
Ecco il metodo completo che chiamo il mio AsyncTask personalizzato da. Tutti i messaggi di registrazione che ho fino a creare AsyncTask vengono visualizzati nel registro. Nessuna delle eccezioni sono.
La registrazione mostra il valore dell'URL appena prima di creare il mio AsyncRequest e l'URL non è affatto malformato. È quello che mi aspetto.
public void GetServerInfoAsync(IApiCallback callback, Context context) throws IllegalArgumentException, Exception {
if (callback == null)
throw new IllegalArgumentException("callback");
if (context == null)
throw new IllegalArgumentException("context");
try {
FileLogger.getFileLogger(context).ReportInfo("Build URL");
String url = GetApiUrl("System/Info");
FileLogger.getFileLogger(context).ReportInfo("Finished building URL");
if (url != null) {
FileLogger.getFileLogger(context).ReportInfo("GetServerInfoAsync: url is " + url);
new AsyncRequest(callback, context).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
} else {
FileLogger.getFileLogger(context).ReportError("GetServerInfoAsync: url is null");
}
} catch (IllegalArgumentException iae) {
FileLogger.getFileLogger(context).ReportException("GetServerInfoAsync: IllegalArgumentException", iae);
throw iae;
} catch (Exception e) {
FileLogger.getFileLogger(context).ReportException("GetServerInfoAsync: Exception", e);
throw e;
}
}
Se l'errore è già stato rilevato prima di questa richiesta, mostrare il codice prima di chiamarlo. – Gustek
Hai messo il log in del codice in esecuzione per creare il 'AsyncTask'? Forse questo ti permetterebbe di vedere quale linea in realtà sta fallendo? –
Gustek. L'errore non sembra essere prima che lo chiami. Ho aggiunto il metodo di chiamata al mio post originale. – Redshirt