Android 为什么';这不是主活动线程的结束吗?
调用onDestory->仍在运行的线程 测试设备OS8.0 为什么它不停止后台工作8.0 我知道安卓8.0的后台工作不起作用 以下是示例代码:Android 为什么';这不是主活动线程的结束吗?,android,Android,调用onDestory->仍在运行的线程 测试设备OS8.0 为什么它不停止后台工作8.0 我知道安卓8.0的后台工作不起作用 以下是示例代码: import android.content.Intent; import android.support.v7.app.`enter code here`AppCompatActivity; import android.os.Bundle; import android.util.Log; import andro
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");
}
}
如果使用简单处理程序而不是线程更新UI,并在销毁时使用remove回调,会发生什么情况。这是使用处理程序的示例代码。请尝试此操作
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();
}
或
如果要使用线程,请尝试在销毁时添加此代码
中断() 如果使用简单处理程序更新UI而不是线程,并在销毁时使用remove回调,会发生什么情况。这是使用处理程序的示例代码。请尝试此操作
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();
}
或
如果要使用线程,请尝试在销毁时添加此代码
中断() 请。看,这实际上是内存泄漏。您正在创建一个非静态的内部类,该类保存对外部类的引用,它还防止您的主活动引用被标记为垃圾回收。我知道这是内存泄漏模式。但是安卓8.0更新了GC的内容。背景作品也很有限。因此,在这种情况下,无限使用后台工作?请。看,这实际上是内存泄漏。您正在创建一个非静态的内部类,该类保存对外部类的引用,它还防止您的主活动引用被标记为垃圾回收。我知道这是内存泄漏模式。但是安卓8.0更新了GC的内容。背景作品也很有限。那么在这种情况下,无限使用后台工作?