[Android] gestion multi thread et consommation de la batterie
Bonjour,
je viens de developper une application qui gère un système multi thread
je fais un requête sqlite avec un timeout..
j'ai un message comme quoi mon application est énergivore
après un certains temps d'utilisation
je fais donc appel a vous pour résoudre mon problème..
merci pour vos réactions.
Problème de géo-localisation..?
Merci pour ta réaction..
Tu pense alors que c'est la géo-localisation ?
J'ai dans mon manifest.xml j'ai autorisé seulement access.Coarse.location et pas le access.Fine.location
Tu pense que cela est suffisant ?
Code de ma tache asychrone et de la localisation
merci pour ta réaction..
edit: ma consomation sur le smartphone est de 13mAh
je ne connais pas la signification de cette valeur
voici mon code de la localisation qui est dans ma tache asychrone..
pour l'instant j'ai désactiver les requête sql je fait les comparaison avec une valeur statique pour les test..
et j'ai toujours ce message que mon application est énergivore..
La tache est executer toute les 60 sec..
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| public static class ProgressTask extends AsyncTask<Void, Integer, Boolean> {
// Identifiant de la boîte de dialogue
public final static int ID_DIALOG = 0;
public ProgressTask asyncObject;
boolean flag = false;
// Référence faible à l'activité
private WeakReference<MainActivityTwo> mActivity = null;
MyLocationLinstener gps;
MyLocationLinstener network;
Context C = VolleyApplication.getInstance().getApplicationContext();
WeakReference<Context> weakReference = new WeakReference<Context>(C);
public ProgressTask(MainActivityTwo pActivity) {
link(pActivity);
}
@Override
protected void onPreExecute() {
// Au lancement, on affiche la boîte de dialogue
// super.onPreExecute();
flag = true;
}
@Override
protected Boolean doInBackground(Void... params) {
while (flag) {
//Your Code what you are doing in the Do inBackground
boolean isValueFoundNw = false;
boolean isValueFoundGps = false;
gps = new MyLocationLinstener(C) {
};
network = new MyLocationLinstener(C) {
};
LocationManager locationManager;
locationManager = (LocationManager) C
.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (isNetworkEnabled) {
Log.i("NetworkTest", "true");
if (network.canGetLocation()) {
Log.i("NetworkCangetlocation", "true");
double latitude = network.getLatitude();
double longitude = network.getLongitude();
//---------------------------------------------------------------------------------------
final Location loc = new Location(LocationManager.NETWORK_PROVIDER);
final Location loc2 = new Location(LocationManager.NETWORK_PROVIDER);
// test radius network coar
float radius = 30;
float distance;
String lat = "50.778305";
String lng = "4.332104";
double lat1 = Double.parseDouble(lat);
double lng1 = Double.parseDouble(lng);
loc.setLatitude(Double.parseDouble(lat));
loc2.setLatitude(latitude);
loc.setLongitude(Double.parseDouble(lng));
loc2.setLongitude(longitude);
distance = loc2.distanceTo(loc);
if (distance < 30 || distance > 680) {
// do someting..
}
if (isValueFoundNw) {
// do someting..
}
}
}
try {
Thread.sleep(60000);//Your Interval after which you want to refresh the screen
} catch (InterruptedException e) {
}
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
if (mActivity.get() != null) {
if (result)
Toast.makeText(mActivity.get(), "Location running..", Toast.LENGTH_SHORT).show();
else
Toast.makeText(mActivity.get(), "No Location found", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onProgressUpdate(Integer... prog) {
// À chaque avancement du téléchargement, on met à jour la boîte de dialogue
Log.i("onPorgressUpdate", "Fait");
}
@Override
protected void onCancelled() {
if (mActivity.get() != null)
Toast.makeText(mActivity.get(), "No Location found", Toast.LENGTH_SHORT).show();
}
public void link(MainActivityTwo pActivity) {
mActivity = new WeakReference<MainActivityTwo>(pActivity);
}
} |
et voici ma fonction qui est appeler dans ma fonction OnCreate() la localisation est executer aussi toute les 60 sec
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| private void addLocationListener() {
Log.i("addLocationListener", "function is RUNNING!");
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);
final Belgium bel = new Belgium();
final String PROVIDER = lm.getBestProvider(c, true);
final Location locGps = new Location(LocationManager.GPS_PROVIDER);
final Location locNet = new Location(LocationManager.NETWORK_PROVIDER);
this.myLocationListener = new MyLocationLinstener(getApplicationContext()) {
@Override
public void onLocationChanged(Location location) {
super.onLocationChanged(location);
// On recrée à chaque fois l'objet
mProgress = new ProgressTask(MainActivityTwo.this);
// On l'exécute
mProgress.execute();
//mProgress.cancel(true);
if (running == false) {
//destroy process..
mProgress.cancel(true);
running = true;
}
Toast.makeText(context, "Location changed", Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
super.onProviderDisabled(provider);
//Toast.makeText(context, "Gps Disabled", Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderEnabled(String provider) {
super.onProviderEnabled(provider);
Toast.makeText(context, "Gps Enabled", Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
super.onStatusChanged(provider, status, extras);
}
};
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
this.lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, this.myLocationListener);
} |
pur mes test je fait la localisation avec le wifi et l'antenne relais.. je laisse le gps pour après.. vu que cette techno est plus consommatrice en energie que le résaux
implementation de la méthode onLocationChanged()
Merci pour ta réaction ..
et pour tes explications sans cela je n'aurais pas avancé
je mets ma logique metier dans la méthodes onLocationChanged()
et je tiens au courant de l'avancement du projet..
merci encore pour ton aide ;)
UP: ma fonction onLocationChanged() ne tourne pas quand le device est en veille..
Me revoilà..
mais voilà que la fonction onLocationChanged() ne tourne pas en backgroud
en fait quand le device est en veille il ne fait rien.. Je change pourtant de position..
je doit tous de même implémenter ma tach asychrone du coup?
j'attend votre avis..
Merci pour vos réactions.
OnChangeLocation et location
On c'est presque croiser sur ce post 😉
Je me pose des questions quand même..
Ma fonction onChangeLocation se déclenche pas au deuxième coup vu que je ne change pas de position..
Vu que je suis connecté à mon WiFi et l'antenne relais du coup il ne détecte pas de changement significatif.. Dite moi si je me trompe ?
Mon application est développé pour prévenir des dérangement des appels reçu par l'utilisateur sur les places public..
Merci d'avance..
Consommation batterie message récurent
Me revoilà..
J'ai toujours ce message de consommation énergétique..
J'ai une requête on location toute les 3 minutes, c'est peut-être la permission access_fine_location qui pose problème dans ce cas je ne peux pas utiliser le GPS..?
Comment debuger et résoudre ce souci ?
Il y a avec Android studio ou adb moyen de contrôler la consommation de la batterie ?
Merci d'avance