rufen Sie AsyncTask aus dem Broadcast receiver, android
ALSO derzeit habe ich einen AsyncTask-Klasse, die läuft und die POST-Daten an meinen server, wenn ich auf einen button(der funktioniert Super).
Was ich versuche zu tun, ist jetzt handhaben, was passiert, wenn der Benutzer nicht mit dem internet verbunden. so habe ich diese Klassen, um Benachrichtigen Sie die app, wenn internet angeschlossen, so dass die Daten gesendet werden können, automatisch an den server.
AsyncTask-Klasse(innere Klasse)
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
ProgressDialog dialog = new ProgressDialog(getActivity());
final AlertDialog finishedDialog = new AlertDialog.Builder(getActivity())
.setCancelable(false)
.setPositiveButton(android.R.string.ok, null)
.create();
@Override
protected String doInBackground(String... urls) {
onProgressUpdate("Uploading Data...");
return POST(urls[0]);
}
@Override
protected void onPreExecute() {
this.dialog.show();
finishedDialog.setOnShowListener(new DialogInterface.OnShowListener(){
@Override
public void onShow(DialogInterface dialog) {
Button b = finishedDialog.getButton(AlertDialog.BUTTON_POSITIVE);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//navigate to match summary.....
finishedDialog.dismiss();
}
});
}
});
}
protected void onProgressUpdate(String msg) {
dialog.setMessage(msg);
}
//onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
if (result != ""){
finishedDialog.setTitle("Upload Complete!");
finishedDialog.setMessage("Data Sent Successfully");
finishedDialog.show();
dialog.dismiss();
editor.clear();
editor.commit();
//Toast.makeText(getActivity().getBaseContext(), result, Toast.LENGTH_LONG).show();
}else
{
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
finishedDialog.setTitle("Upload Failed!");
finishedDialog.setMessage("Data Will Automatically Be Uploaded When Internet Connection Is Available");
finishedDialog.show();
dialog.dismiss();
}}, 1000);
setFlag(true);
}
}
}
public static boolean getFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String POST(String url){
InputStream inputStream = null;
String result = "";
try {
//1. create HttpClient
HttpClient httpclient = new DefaultHttpClient();
//2. make POST request to the given URL
HttpPost httpPost = new HttpPost(url);
if(adapter.updateNeeded()){
JSONObject main = new JSONObject(exmaplePrefs.getString("jsonString", "cant find json"));
JSONObject dbUpdates = new JSONObject(exmaplePrefs.getString("ChangesJSON", "cant find Changejson"));
main.put("Team_Updates", dbUpdates);
json = main.toString();
}else{
json = exmaplePrefs.getString("jsonString", "cant find json");
//String json = "{\"twitter\":\"test\",\"country\":\"test\",\"name\":\"test\"}";
}
//5. set json to StringEntity
StringEntity se = new StringEntity(json);
se.setContentType("application/json;charset=UTF-8");
//6. set httpPost Entity
httpPost.setEntity(se);
//7. Set some headers to inform server about the type of the content
//httpPost.setHeader("Accept", "application/json");
//httpPost.setHeader("Content-type", "application/json");
//httpPost.setHeader("json", json);
//8. Execute POST request to the given URL
HttpResponse httpResponse = httpclient.execute(httpPost);
//9. receive response as inputStream
inputStream = httpResponse.getEntity().getContent();
String status = httpResponse.getStatusLine().toString();
//10. convert inputstream to string
if (!status.equals("HTTP/1.1 500 Internal Server Error")){
if(inputStream != null){
result = convertInputStreamToString(inputStream);
}
else{
result = "Did not work!";
}
}else{
System.out.println("500 Error");
}
} catch (Exception e) {
Log.d("InputStream", e.getLocalizedMessage());
System.out.println("eerroorr "+e);
}
//11. return result
System.out.println(result);
return result;
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException{
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
}
NetworkUtil Klasse
public class NetworkUtil {
public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 2;
public static int TYPE_NOT_CONNECTED = 0;
public static int getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
public static String getConnectivityStatusString(Context context) {
int conn = NetworkUtil.getConnectivityStatus(context);
String status = null;
if (conn == NetworkUtil.TYPE_WIFI) {
status = "Wifi enabled";
} else if (conn == NetworkUtil.TYPE_MOBILE) {
status = "Mobile data enabled";
} else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
status = "Not connected to Internet";
}
return status;
}
}
BroadcastReceiver-Klasse
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
intent.getExtras();
String status = NetworkUtil.getConnectivityStatusString(context);
Toast.makeText(context, status, Toast.LENGTH_LONG).show();
if(MatchFragment.getFlag()){
//send data
}
}
}
So, in der BroadcastReceiver-Klasse, ich check die Flagge, die auf true festgelegt wird, wenn die app versucht, Daten zu senden, aber es ist nicht internet (onPostExecute in AsyncTask-Klasse).
also das, was Sie wollen zu tun ist, wie einige Aufruf der POST-Methode. muss ich zum erstellen eines neuen Asynchronen task-Klasse? Ich bin ein wenig ratlos hier .
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
AsyncTask
imBroadcastReceiver
ist ein bad Praxis.Sollten Sie verwenden
Service
weil Android-OS töten kann Ihren Prozess oderonReceive()
können bis zum Abschluss ausgeführt, bevorasyncTask
zurück führen, so gibt es keine Garantie, Sie bekommen das erwartete Ergebnis.Sollten Sie nicht verwenden AsyncTask in Broadcast-Empfänger, da das system töten kann, Ihr Prozess nach der Rückkehr von der onReceive-Methode (wenn es keine aktiven Dienstes oder der Tätigkeit).
Beweis link
Offizielle Dokumentation empfiehlt IntentService für solche Fälle (siehe Absatz über den Broadcast-Receiver).
Die anderen Antworten sind nicht korrekt laut Google Dokumentation. Der Broadcast Receiver developer guide ruft explizit aus, die Sie verwenden können
AsyncTask
s ausBroadcastReceiver
s, wenn Sie anrufengoAsync()
ersten und berichten den status an, um das ausstehende Ergebnis in derAsyncTask
Dann später klärt, wie viel Zeit Sie tatsächlich bekommen:
data
ist nicht definiert, das ganze async-task-Signatur ist unerklärt und das beste: wenn Ihnen ein Vorsatz von LocalBroadcastManager,goAsync
es kann manchmal null Absturz des asynchronen Ausführung im hintergrund.