Custom-Async-Http-Client in Android
Benutze ich https://github.com/loopj/android-async-http aber ich denke, dies kann angewendet werden, um eine Asynchrone Aufgabe (einheimische)
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onStart() {
//called before request is started
//Some debugging code here
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
//called when response HTTP status is "200 OK"
//here is the interesting part
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
//called when response HTTP status is "4XX" (eg. 401, 403, 404)
//Some debugging code here, show retry dialog, feedback etc.
}
@Override
public void onRetry(int retryNo) {
//Some debugging code here-------
}
});
Ich benutze es eine Menge in viele separate Klassen. Die onStart, onFailure und onRetry sind überall die gleichen, nur kopieren und einfügen, nur die onSuccess ist anders.
Ich will meinen code so sauber wie möglich und wiederverwenden, was ich schon geschrieben hab, also meine Frage ist, wie Mach ich das Brauch, in einem separaten "Datei", und einfach wiederverwenden. Ich brauche nur die "OnSuccess" - Funktion. Danke
---------------------------------------
LÖSUNG für GET & POST (Dank furkan3ayraktar)
1. Datei RequestListener
package com.classicharmony.krakenmessages.utils.AsyncHttp;
import org.apache.http.Header;
public interface RequestListener {
public void onSuccess(int statusCode, Header[] headers, byte[] response);
}
2. Datei RequestHandler
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import org.apache.http.Header;
import org.apache.http.entity.StringEntity;
import java.io.UnsupportedEncodingException;
public class RequestHandler {
private static RequestHandler instance;
private AsyncHttpClient client;
private static final boolean SHOW_DEBUG_ALERT_DIALOG = true;
private RequestHandler() {
client = new AsyncHttpClient();
}
public static RequestHandler getInstance() {
if (instance == null) {
instance = new RequestHandler();
}
return instance;
}
public void make_get_Request(final Context context, final String url, final RequestListener listener) {
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onStart() {
Log.v("▒▒▒▒▒▒▒ GET ", url);
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
listener.onSuccess(statusCode, headers, response);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
Log.e("▒▒▒▒▒▒▒ GET FAILED ", url);
Log.e("▒▒▒▒▒▒▒ GET FAILED ", e.getLocalizedMessage());
if (DUtils.isDebuggable(context) && SHOW_DEBUG_ALERT_DIALOG) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("▒▒▒▒▒ ERROR ▒▒▒▒▒");
String error_msg;
if (errorResponse != null) {
try {
error_msg = String.valueOf(new String(errorResponse, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
error_msg = e.getLocalizedMessage();
}
} else {
error_msg = e.getLocalizedMessage();
}
builder.setMessage(context.getClass().getSimpleName() + " -> " + error_msg)
.setCancelable(true)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
@Override
public void onRetry(int retryNo) {
Log.e("▒▒▒▒▒▒▒ RETRYING ", "....." + String.valueOf(retryNo));
}
});
}
public void make_post_Request(final Context context, final StringEntity entity, final String url, final RequestListener listener) {
client.post(context, url, entity, "application/json", new AsyncHttpResponseHandler() {
@Override
public void onStart() {
Log.v("▒▒▒▒▒▒▒ POST ", url);
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
listener.onSuccess(statusCode, headers, response);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
Log.e("▒▒▒▒▒▒▒ POST FAILED ", url);
Log.e("▒▒▒▒▒▒▒ POST FAILED ", context.getClass().getSimpleName() + " -> " + e.getLocalizedMessage());
if (DUtils.isDebuggable(context) && SHOW_DEBUG_ALERT_DIALOG) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("▒▒▒▒▒ ERROR ▒▒▒▒▒");
String error_msg;
if (errorResponse != null) {
try {
error_msg = String.valueOf(new String(errorResponse, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
error_msg = e.getLocalizedMessage();
}
} else {
error_msg = e.getLocalizedMessage();
}
builder.setMessage(context.getClass().getSimpleName() + " -> " + error_msg)
.setCancelable(true)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
@Override
public void onRetry(int retryNo) {
Log.e("▒▒▒▒▒▒▒ RETRYING ", "....." + String.valueOf(retryNo));
}
});
}
}
3. "utility", um das Dialogfeld oder nicht.
public static boolean isDebuggable(Context ctx) {
boolean debuggable = false;
X500Principal DEBUG_DN = new X500Principal("CN=Android Debug,O=Android,C=US");
try {
PackageInfo pinfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES);
Signature signatures[] = pinfo.signatures;
CertificateFactory cf = CertificateFactory.getInstance("X.509");
for (int i = 0; i < signatures.length; i++) {
ByteArrayInputStream stream = new ByteArrayInputStream(signatures[i].toByteArray());
X509Certificate cert = (X509Certificate) cf.generateCertificate(stream);
debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN);
if (debuggable)
break;
}
} catch (PackageManager.NameNotFoundException e) {
//debuggable variable will remain false
} catch (CertificateException e) {
//debuggable variable will remain false
}
return debuggable;
}
Beispiel wie man es nennen für die POST:
JSONObject jsonParams = new JSONObject();
StringEntity entity;
try {
jsonParams.put("from_user_id", "dan");
jsonParams.put("to_user_id", "vili");
jsonParams.put("message", "hello world");
entity = new StringEntity(jsonParams.toString());
} catch (JSONException e) {
e.printStackTrace();
return;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return;
}
RequestHandler handler = RequestHandler.getInstance();
handler.make_post_Request(getActivity(), entity, "http://your_server/api/etc", new RequestListener() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
try {
String server_response = String.valueOf(new String(response, "UTF-8"));
Log.v("Server response",server_response);
} catch (UnsupportedEncodingException e1) {
}
}
});
- Vielen Dank... Es funktioniert wie ein Charme.. vielen Dank.. Durch die Art und Weise es bearbeitet wurde im Jahr 2014..das muss sein, altmodisch. Bitte sagen Sie mir, wenn Sie etwas jetzt oder gleich. Nochmals vielen Dank.
- naja.. es gibt neuere Möglichkeiten... leichter.... aber wenn es funktioniert, dann verwenden Sie es. testen Sie es auf einigen Handys und Versionen, und wenn es bekommt den job getan es so belassen.
- AYE.. Frage War halt.. Einfachste Weg, ich fand heraus, bis zu dem Datum.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen gemeinsame request-handler und listener. Sie können auch verschiedene request-Methoden wie makeRequest für jede Anforderung, die Sie wollen, und auch verschiedene Hörer. Hier ist ein einfaches Muster, das ich meistens benutze,
Verwenden Sie dann wie folgt in überall Sie wollen.
Könnte man erstellen Sie Ihre eigenen, leeren version von
AsyncHttpResponseHandler
, die nicht Umsetzung deronSuccess
Methode.Dein code würde dann so Aussehen:
Offensichtlich, Sie können füllen Sie einige Inhalte, die in den nicht-overrided Methoden in der Basisklasse.
Ersten Sie machen eine abstrakte Basisklasse implementiert, dass das Verhalten üblich ist. So etwas wie dieses:
Dann per url, die Sie von der Basisklasse geerbt und Umsetzung der
onSuccess()
Methode, mit der Antwort.Und Sie machen die HTTP-Anforderung wie folgt:
Also, wenn Sie wollen, um Anrufe zu tätigen, um mehr urls, einfach weiter zu machen, neue Unterklassen, basierend auf dem Basis-Klasse, damit Sie Erben die gemeinsamen Fehler Behandlung.