Tuesday, 15 January 2013

android - Why does my app crash when my service makes an alertdialog? -



android - Why does my app crash when my service makes an alertdialog? -

hi i'm trying create service runs in background after user puts in amount of time. after amount of time alartdialog appears , ringtone user selected rings until cancel it. unfortunately error causes app crash. if need anymore info inquire :)

my service class

import java.util.timer; import java.util.timertask; import org.holoeverywhere.app.alertdialog; import org.holoeverywhere.preference.preferencemanager; import org.holoeverywhere.preference.sharedpreferences; import android.app.service; import android.content.context; import android.content.dialoginterface; import android.content.intent; import android.media.ringtone; import android.media.ringtonemanager; import android.net.uri; import android.os.ibinder; import android.os.vibrator; import android.util.log; public class countdownservice extends service { @override public void oncreate() { super.oncreate(); } int hr = 990; int min = 990; int sec = 990; context c; alertdialog alertdialog; sharedpreferences getprefs; vibrator v; ringtone r; @override public int onstartcommand(intent intent, int flags, int startid) { string input = intent.getstringextra("timeleft"); string[] strarray = input.split(","); c = this.getapplicationcontext(); getprefs = preferencemanager.getdefaultsharedpreferences(c); v = (vibrator) c.getsystemservice(context.vibrator_service); build(); (string t : strarray) { if (hour == 990) { hr = integer.parseint(t); } else { if (min == 990) { min = integer.parseint(t); }else{ if (sec == 990) { sec = integer.parseint(t); } } } } timer timer = new timer(); timertask tt = new timertask() { @override public void run() { sec--; updatetime(); } }; timer.schedule(tt, 0, 1000); homecoming start_sticky; } private void build() { alertdialog.builder alertdialogbuilder = new alertdialog.builder(c); // set title alertdialogbuilder.settitle("time's up!!!"); // set dialog message alertdialogbuilder.setmessage("press ok stop alarm") .setcancelable(true) .setneutralbutton("ok", new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int id) { if (r != null) { if (r.isplaying()) { r.stop(); } } alertdialog.cancel(); alertdialog.cancel(); } }); alertdialog = alertdialogbuilder.create(); } @override public ibinder onbind(intent arg0) { homecoming null; } private void updatetime() { if (hour <= 0 && min <= 0 && sec <= 0) { done(); } if (sec < 0) { min --; sec = 59; } if (min < 0) { hr --; min = 59; } } private void done() { uri uri; boolean notmuted = getprefs.getboolean("muted", true); boolean viberate = getprefs.getboolean("viberate", true); string strringtonepreference = getprefs.getstring("app_ringtone", null); log.v("alarm", "a " + strringtonepreference); if (viberate) { v.vibrate(1000); } if (notmuted) { if (strringtonepreference != null) { uri = uri.parse(strringtonepreference); log.v("alarm", "was parsed"); } else { log.v("alarm", "was not parsed"); uri = null; } playsound(this.getapplicationcontext(), uri); } } private void playsound(context context, uri alert) { r = ringtonemanager.getringtone(context, alert); if (r != null) { r.play(); log.v("alarm", "was not null"); } alertdialog.show(); } }

my log

02-10 19:13:07.875: e/androidruntime(23231): fatal exception: timer-0 02-10 19:13:07.875: e/androidruntime(23231): java.lang.runtimeexception: can't create handler within thread has not called looper.prepare() 02-10 19:13:07.875: e/androidruntime(23231): @ android.os.handler.<init>(handler.java:121) 02-10 19:13:07.875: e/androidruntime(23231): @ android.view.viewrootimpl.<init>(viewrootimpl.java:371) 02-10 19:13:07.875: e/androidruntime(23231): @ android.view.windowmanagerimpl.addview(windowmanagerimpl.java:267) 02-10 19:13:07.875: e/androidruntime(23231): @ android.view.windowmanagerimpl.addview(windowmanagerimpl.java:215) 02-10 19:13:07.875: e/androidruntime(23231): @ android.view.windowmanagerimpl$compatmodewrapper.addview(windowmanagerimpl.java:140) 02-10 19:13:07.875: e/androidruntime(23231): @ android.app.dialog.show(dialog.java:278) 02-10 19:13:07.875: e/androidruntime(23231): @ com.chair49.holotimer.countdownservice.playsound(countdownservice.java:169) 02-10 19:13:07.875: e/androidruntime(23231): @ com.chair49.holotimer.countdownservice.done(countdownservice.java:147) 02-10 19:13:07.875: e/androidruntime(23231): @ com.chair49.holotimer.countdownservice.updatetime(countdownservice.java:113) 02-10 19:13:07.875: e/androidruntime(23231): @ com.chair49.holotimer.countdownservice.access$0(countdownservice.java:111) 02-10 19:13:07.875: e/androidruntime(23231): @ com.chair49.holotimer.countdownservice$1.run(countdownservice.java:67) 02-10 19:13:07.875: e/androidruntime(23231): @ java.util.timer$timerimpl.run(timer.java:284)

you can't phone call ui stuff background thread. can utilize runonuithread().

android android-service android-alertdialog

No comments:

Post a Comment