2017-08-29 71 views
1

Call onDestory - >仍然有效線程 測試設備OS 8.0爲什麼不在Mainactivity線程上完成?

爲什麼它不停止後臺工作8.0?

我知道Android 8.0後臺工作無法正常工作。

下面是示例代碼:

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

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

+0

這實際上是一個內存泄漏。你正在創建一個非靜態的內部類,它持有對外部類的引用,它也阻止你的主要活動引用被標記爲垃圾回收 –

+0

我知道這是內存泄漏模式。但Android 8.0更新GC的內容。和背景作品是有限的。所以在這種情況下無限使用後臺工作? –

回答

0

如果使用簡單的處理程序來更新UI,而不是線程,並使用刪除在destroy.This回調會發生什麼事是使用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();

相關問題