2013-02-11 3 views
2

Привет, Я пытаюсь сделать службу, которая работает в фоновом режиме после того, как пользователь наберет время. По истечении этого времени появляется alartDialog и мелодия звонка, которую выбрал пользователь, до тех пор, пока он не отменит его. К сожалению, я получаю сообщение об ошибке, которое приводит к сбою моего приложения. Если вам нужно больше информации просто спросите :)Почему мое приложение падает, когда моя служба делает alertdialog?

мой класс службы

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 hour = 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(); 
    for (String t : strArray) { 

     if (hour == 990) { 
      hour = 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); 

    return 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 to 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) { 

    return null; 
} 
private void updateTime() { 
    if (hour <= 0 && min <= 0 && sec <= 0) { 
     done(); 

    } 
    if (sec < 0) { 
     min --; 
     sec = 59; 
    } 
    if (min < 0) { 
     hour --; 
     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 inside thread that has not called Looper.prepare() 
02-10 19:13:07.875: E/AndroidRuntime(23231): at android.os.Handler.<init>(Handler.java:121) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:371) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at android.app.Dialog.show(Dialog.java:278) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at com.chair49.holotimer.CountDownService.playSound(CountDownService.java:169) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at com.chair49.holotimer.CountDownService.done(CountDownService.java:147) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at com.chair49.holotimer.CountDownService.updateTime(CountDownService.java:113) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at com.chair49.holotimer.CountDownService.access$0(CountDownService.java:111) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at com.chair49.holotimer.CountDownService$1.run(CountDownService.java:67) 
02-10 19:13:07.875: E/AndroidRuntime(23231): at java.util.Timer$TimerImpl.run(Timer.java:284) 
+1

Создание диалога невозможно. Я предлагаю создать мероприятие с помощью темы диалога и передать данные. – Geros

ответ

0

Я, наконец, получил его. То, что мне нужно было сделать, - начать новую работу и создать диалог оповещений и звук, после чего прекратить действие.

0

Вы не можете назвать вещи UI от фонового потока. Вы можете использовать runOnUiThread().

+1

[Услуги] (http://developer.android.com/reference/android/app/Service.html) запускается в потоке пользовательского интерфейса (* «Служба не является нитью.» *), Но они * не * имеют свои окна. –

+0

Согласитесь с @ A - C. Я, хотя «Службы» - это потоки, это фоновая задача. – Geros

+0

В дополнение к Сервисам, которые не могут сделать Dialogs, @Clyde, вы связаны с методом 'Activity', который явно не является« Сервисом » –

Смежные вопросы