Я создал службу в андроиде, который работает по два потока одновременно один через каждые 30 секунд и другой через каждые 5 минут. стенд из них, вызывающий апи. до тех пор, пока мой телефон не подключится к системе, чтобы наблюдать за журналами, он работает нормально, но поскольку я отключу телефон от системы 5 минут, нить запускает неправильное поведение, он не запускается через каждые 5 минут.Нитки в обслуживании не работают должным образом
Вот мой код.
if (fivemiuntesHandler == null) {
Log.d(TAG, "Location update started five minutes ..............: ");
fivemiuntesHandler = new Handler();
fivemiuntesHandler.postDelayed(fiveminutes, 300000);
}
if (thirtysecHandler == null) {
Log.d(TAG, "Location update started five minutes ..............: ");
thirtysecHandler = new Handler();
thirtysecHandler.postDelayed(thirtySec, 0);
}
private Runnable fiveminutes = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
sharedPreferences = getSharedPreferences("user_detail",
MODE_WORLD_WRITEABLE);
login_id = sharedPreferences.getString("login_id", "");
url = sharedPreferences.getString("url", "");
responseArray= null;
response= null;
try {
URL URl;
byte[] data;
String lat_current_pos = null, lng_current_pos = null,address_base64 = null,lat_base64,lng_base64;
lat_current_pos = lat;
lng_current_pos=lng;
data = gcm_id.getBytes("UTF-8");
String gcm_base64 = Base64.encode(data);
data = login_id.getBytes("UTF-8");
String login_base64 = Base64.encode(data);
if(Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE)!=0 && Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE) !=1){
data = getAddress(new LatLng(Double.valueOf(lat_current_pos), Double.valueOf(lng_current_pos))).getBytes("UTF-8");
address_base64 = Base64.encode(data);
}else
{
data = "LOCATION_MODE_OFF".getBytes("UTF-8");
address_base64 = Base64.encode(data);
}
if(Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE)==0 || Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE)==1)
{
data = "".getBytes("UTF-8");
lat_base64 = Base64.encode(data);
data = "".getBytes("UTF-8");
lng_base64 = Base64.encode(data);
}else{
data = lat_current_pos.getBytes("UTF-8");
lat_base64 = Base64.encode(data);
data = lng_current_pos.getBytes("UTF-8");
lng_base64 = Base64.encode(data);
}
data = name.getBytes("UTF-8");
String name_base64 = Base64.encode(data);
data = "I".getBytes("UTF-8");
String flag_base64 = Base64.encode(data);
URl = new URL(
getResources().getString(R.string.services_push_lat_lng));
List<NameValuePair> liNameValuePairs = new ArrayList<NameValuePair>();
liNameValuePairs.add(new BasicNameValuePair("login_id",
login_base64));
liNameValuePairs.add(new BasicNameValuePair("gcm_id", gcm_base64));
if(address_base64==null)
{
liNameValuePairs.add(new BasicNameValuePair("address", ""));
}else
liNameValuePairs.add(new BasicNameValuePair("address", address_base64));
liNameValuePairs.add(new BasicNameValuePair("lat", lat_base64));
liNameValuePairs.add(new BasicNameValuePair("lon", lng_base64));
liNameValuePairs.add(new BasicNameValuePair("name", name_base64));
if (url.contains("boss.xsinfosol.com")) {
liNameValuePairs
.add(new BasicNameValuePair("flag", flag_base64));
}
ApiCallingclass apiCallingclass = new ApiCallingclass();
responseArray = apiCallingclass.callApi(liNameValuePairs, URl);
response = responseArray[0];
System.out.println("5 minutes " + response +" "+login_id);
} catch (UnknownHostException e) {
e.printStackTrace();
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
fivemiuntesHandler.postDelayed(fiveminutes, 300000);
}
};
private Runnable thirtySec = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
update_current_location_tracker uLocation_tracker = new update_current_location_tracker();
uLocation_tracker.execute();
thirtysecHandler.postDelayed(thirtySec, 30000);
}
};
Так что, пожалуйста, помогите мне в этом.
попытайтесь установить свой сервис exported = "true", установив эту службу в свой собственный процесс, как приложение, независимо, надеюсь, тогда вы не получите эту ошибку. –
Обратите внимание, что runnables с обработчиками не запускаются в отдельном потоке. Они все еще находятся в потоке службы. –
. Вы можете проверить, есть ли какая-либо ошибка в стеке из 5-минутного обработчика. Ошибки времени выполнения, такие как нулевые указатели, могут не быть захвачены блоком try-catch. Или попробуйте post post в блоке 'finally'. В общем, как объясняется в ответе ниже, вы должны использовать будильник для долгосрочных повторяющихся заданий. – headuck