2015-07-02 3 views
0

У меня есть приложение для Android, у которого есть класс, который запускает поток. В основном то же самое, что и here.Приложение для Android - Резюме темы

В настоящее время поток обновляет текстовое представление с вычисленным значением каждые 500 мс и дополнительно регистрирует значение, поэтому я вижу его в adb-logcat.

Когда я выхожу из своего приложения с помощью кнопки с обратной связью устройства, поток по-прежнему работает в фоновом режиме. (Это то, что я хочу). Adb-logcat все еще дает мне значения, которые поток вычисляет.

Но когда я снова открываю приложение, текстовое изображение больше не обновляется!

Что мне нужно сделать, чтобы возобновить обновление текстового поля, когда я снова открою приложение?

Вот мой упрощенный код:

SensorProcessor.java

public class SensorProcessor implements Runnable { 

    protected Context mContext; 
    protected Activity mActivity; 

    private volatile boolean running = true; 
    //Tag for Logging 
    private final String LOG_TAG = SensorProcessor.class.getSimpleName(); 

    public SensorProcessor(Context mContext, Activity mActivity){ 
     this.mContext = mContext; 
     this.mActivity = mActivity; 
    } 


    public void run() { 

      while (running){ 

       try {      
        final String raw = getSensorValue(); 
        mActivity.runOnUiThread(new Runnable() { 
         public void run() { 
          final TextView textfield_sensor_value; 
          textfield_sensor_value = (TextView) mActivity.findViewById(R.id.text_sensor); 
          textfield_sensor_value.setText("Sensor Value: " + raw); // <-------- Does not update the field, when app resumes 
          Log.v(LOG_TAG, raw); // <-------- Still working after the app resumes 
         } 
        }); 


        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        //When an interrupt is called, we set running to false, so the thread can exit nicely 
        running = false; 
       } 
      } 

      Log.v(LOG_TAG, "Sensor Thread finished"); 

    } 
} 

MainActivity.java

public class MainActivity extends Activity implements OnClickListener, OnInitListener { 
    //Start the Thread, when the button is clicked 
    public void onClick(View v) { 
     if (v.getId() == R.id.button_start) { 
      runnable = new SensorProcessor(this.getApplicationContext(),this); 
      thread = new Thread(runnable); 
      thread.start(); 
     } 
} 
+0

В методе onDestroy установленный флаг выполнения на false – SKT

+0

Вам нужно показать код, где и как вы создаете новый 'Thread', и где вы создаете свой' runnable'. – eleven

+0

Добавлен код, где я создаю новую тему –

ответ

1

Вы можете расширить класс Application и вставить туда геттер и сеттер метод для вашего Runnable. Вот пример MyApplication (не забудьте добавить манифеста соединение!), В Manifest.xml:

<application 
    android:name=".MyApplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppBaseTheme" > 

Тогда MyApplication:

public class MyApplication extends Application { 

    private SensorProcessor mSensorProcessor = null; 

    public SensorProcessor getCurrentSensorProcessor(){ 
     return mSensorProcessor; 
    } 

     public void setSensorProcessor(SensorProcessor mSensorProcessor){ 
      this.mSensorProcessor = mSensorProcessor; 
    } 

}

Внутри OnCreate() из Ваша деятельность по вызову:

((MyApplication)getApplication()).getCurrentSensorProcessor().mActivity = this; 

вам необходимо также изменить Runnable конструктор:

public SensorProcessor(Context mContext, Activity mActivity){ 
    this.mContext = mContext; 
    this.mActivity = mActivity; 
    ((MyApplication)mActivity.getApplication()).setSensorProcessor(this); 
} 

И не забудьте освободить экземпляр mSensorProcessor, называя это внутри Runnable когда отделка:

((MyApplication)mActivity.getApplication()).setSensorProcessor(null); 

Наконец, вам нужно изменить OnClick в вашей деятельности:

if (v.getId() == R.id.button_start) { 
     SensorProcessor mSensorProcessor = ((MyApplication)getApplication()).getCurrentSensorProcessor(); 
     if (mSensorProcessor != null) 
      mSensorProcessor.mActivity = this; 
     else { 
      runnable = new SensorProcessor(this.getApplicationContext(), this); 
      thread = new Thread(runnable); 
      thread.start(); 
     } 
    } 

Он должен работать, может быть, некоторыми незначительными изменениями.

+0

Ваш ответ выглядит очень многообещающим, спасибо! Однако я пока этого не понимаю. У меня есть 2 класса (см. Edit in Question). Как и где именно я храню (устанавливаю) свою активность, которую мне нужно получить позже, когда приложение будет возобновлено? –

+0

Я отредактировал и добавил код для вас – yshahak

+0

Вау, спасибо! Это намного сложнее, чем я думал. В настоящее время я реорганизую несколько вещей, чтобы попробовать это. (Я расширил «Activity» вместо «Application», поэтому это решение не будет работать из коробки). –

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