2017-08-29 13 views
1

onDestory - >まだ動作しているスレッド テストデバイスOS 8.0Mainactivityスレッドでこれが終了しないのはなぜですか?

なぜバックグラウンド作業8.0を停止しないのですか?

私はAndroid 8.0のバックグラウンドが動作していないことを知っています。

あなたの代わりに、スレッドのUIを更新し、destroy.This上でコールバックを取り除く使用するように簡単なハンドラを使用している場合はどうなりますか
import android.content.Intent; 
    import android.support.v7.app.`enter code here`AppCompatActivity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.widget.Toast; 


    public class MainActivity extends AppCompatActivity { 
     int count=0; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      Thread thr = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try{ 
          // why not stop after on Destroy 
         while(true) { 
          Log.e("test", "count : " + count+" Status : "); 
          count++; 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            Toast.makeText(MainActivity.this,count+"",Toast.LENGTH_SHORT).show(); 
           } 
          }); 
          Thread.sleep(1000); 
         } 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 

      }); 
      thr.start(); 
     } 

     @Override 
     protected void onDestroy() { 
      super.onDestroy(); 
      Log.e("test","Main activity Destory"); 
     } 
    } 
+0

pls。 https://stackoverflow.com/questions/10544515/how-to-stop-a-running-thread-when-activity-on-destroy-at-android –

+0

これは実際にはメモリリークです。あなたは外部クラスへの参照を保持している非静的な内部クラスを作成しています、それはまた、ガベージコレクションのためにあなたのメインアクティビティ参照がマークされていません –

+0

これはメモリリークパターンです。 Android 8.0はGCのコンテンツを更新します。背景作品は限られています。この場合、無制限のバックグラウンドで作業していますか? –

答えて

0

はhandler.Tryこれを使用したサンプル・コードである:ここで

は、サンプルコードです。

private int mCount = 0; 
private Runnable mRunnable; 
private Handler mNewHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mNewHandler = new Handler(); 
    mRunnable = new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Log.e("test", "mCount : " + mCount + " Status : "); 
       mCount++; 
       Toast.makeText(MainActivity.this, mCount + "", Toast.LENGTH_SHORT).show(); 
      } catch (Exception e) { 
       Log.e("Exception", ""); 
       e.printStackTrace(); 
      } finally { 
       mNewHandler.postDelayed(mRunnable, 1000); 
      } 
     } 
    }; 
    mRunnable.run(); 
} 

@Override 
public void onDestroy() { 
    mNewHandler.removeCallbacks(mRunnable); 
    super.onDestroy(); 
} 

または

あなたは破壊する上で、このコードを追加するスレッドの試みを使用する場合。

thr.interrupt();

関連する問題