0

Я новичок в разработке Android и пытаюсь сделать демо-приложение на службе. Но в учебниках описываются, что службы работают в основном потоке пользовательского интерфейса, я создал поток и поместил мою службу в этот поток для выполнения в фоновом режиме. и он также отлично работает в фоновом режиме в течение нескольких секунд, а затем приложение закрывается, говоря «к сожалению приложение остановилось».к сожалению приложение остановилось при использовании службы в потоке

Вот мой код,

Класс обслуживания

public class UpdateLocation extends Service { 

    private class UpdateLocationThread implements Runnable{ 
     int service_id; 
     UpdateLocationThread(int service_id){ 
      this.service_id = service_id; 
     } 

     @Override 
     public void run() { 
      int i= 0; 
      synchronized (this){ 
       while (i <= 10){ 
        try { 
         wait(15000); 
         i++; 
         Toast.makeText(UpdateLocation.this, "Service ends...", Toast.LENGTH_SHORT).show(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
      stopSelf(service_id); 
     } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public void onDestroy() { 
     Toast.makeText(UpdateLocation.this, "Service ends...", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(UpdateLocation.this, "Service started...", Toast.LENGTH_SHORT).show(); 
     Thread thread = new Thread(new UpdateLocationThread(startId)); 
     thread.start(); 

     return START_STICKY; 
    } 

} 

файл манифеста

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.keval.mejodo" > 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:name=".Model.commonFuncs" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > <!-- android:theme="@style/Theme.AppCompat.NoActionBar" --> 

     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <activity 
      android:name=".MyAppBaseActivity" 
      android:label="@string/title_activity_my_app_base" > 
     </activity> 

     <service android:name=".MServices.UpdateLocation" 
      android:exported="false"></service> 
    </application> 

</manifest> 

Calling обслуживание делая,

Intent intent = new Intent(this, UpdateLocation.class); 
      startService(intent); 

Что может быть причиной остановки приложения? Как это исправить?

+1

post error logcat –

+1

Вы не можете показать Toast из темы, кроме UI thread –

+0

Да, вы правы, так как я удалил Toast, это нормально работает, вы можете опубликовать его как ответ. Еще одно сомнение: могу ли я сделать HTTP-вызовы для моего API в методе запуска потока, передав текущее местоположение из внешнего интерфейса? Я хочу сделать запрос только в фоновом режиме и после каждого определенного периода времени. –

ответ

4

Вы не можете показать Тост в потоке пользовательского интерфейса, если необходимо сделать это как

runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          //yourtoast; 
         } 
        }); 
+0

Работайте, как я удалил Toast, его работа отлично. Могу ли я сделать HTTP-вызовы для моего API в методе запуска потока, передав текущее местоположение из внешнего интерфейса? Я хочу периодически звонить, поэтому он должен быть в фоновом режиме без вмешательства пользователя. –

+0

Если контекст действителен, вы можете показывать тосты, но я рекомендую не делать этого. –

+0

не запускают HTTP-запрос в потоке пользовательского интерфейса, для этого используйте «Async Task». –

1

Вы показываете Тост с внутренней резьбой, который разрешено только в UI тему, удалить его или вызвать его в пользовательском интерфейсе Главная тема.

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