如何在 Activity 开始时停止线程?
How do you stop a Thread when the Activity it was started in is left?
我查看了 onBackPressed()
、onPause()
和 onStop()
,但我能找到的最大问题是我的 Thread
没有在Activity
。我有 MainActivity
和 TiltActivity
。有一个 Button
,按下时,会将您从 MainActivity
发送到 TiltActivity
。一旦进入 TiltActivity
,我就创建了一个 class TCP_IP_Client
的对象。然后我启动一个在 TCP_IP_Client
.
中声明的 'Thread'
我无法将 Thread
参数传递给 onBackPressed()
、onPause()
或 onStop()
。如果我不能在之前的重写函数中中断它,我该如何在 TiltActivity
剩余时停止 Thread
。同样,Thread
未在 TiltActivity
中声明,这将使中断 Thread
变得容易得多。如果您需要进一步说明,请告诉我。
您需要向 TCP_IP_Client 添加一个方法来停止它声明和启动的线程。然后,您可以从您的 TitleActivity 对 TCP_IP_Client 的实例调用该方法(使用包含 TCP_IP_Client 实例的成员变量)。
假设您在 Thread
中有某种循环。
在 TiltActivity
中,您定义一个属性来保存对 Thread
的引用,并定义一个共享的 boolean
来让它知道它应该停止。
并且您提供了用于访问共享变量的同步方法。
在 onResume()
中创建并启动 Thread
,因此每次进入 activity 时都会重新创建它。在 onPause()
中,每次它即将离开前台时,你都会发出停止和中断它的信号;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class ThreadActivity extends AppCompatActivity {
public static final String TAG = ThreadActivity.class.getName();
boolean stopThread = false;
Thread t;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
startTheThread();
}
public synchronized boolean continueRunning(){
return !stopThread;
}
public synchronized void startTheThread(){
this.stopThread = false;
Toast.makeText(ThreadActivity.this,"Thread Starting",Toast.LENGTH_SHORT).show();
t = new Thread(new Runnable() {
@Override
public void run() {
while(continueRunning()){
try {
Thread.sleep(5000);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ThreadActivity.this,"Thread running",Toast.LENGTH_SHORT).show();
}
});
}catch (InterruptedException e){
;//do nothing
}
}
}
});
t.start();
}
public synchronized void stopTheThread(){
this.stopThread = true;
t.interrupt();
Toast.makeText(ThreadActivity.this,"Thread stopped",Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
stopTheThread();
}
}
我查看了 onBackPressed()
、onPause()
和 onStop()
,但我能找到的最大问题是我的 Thread
没有在Activity
。我有 MainActivity
和 TiltActivity
。有一个 Button
,按下时,会将您从 MainActivity
发送到 TiltActivity
。一旦进入 TiltActivity
,我就创建了一个 class TCP_IP_Client
的对象。然后我启动一个在 TCP_IP_Client
.
我无法将 Thread
参数传递给 onBackPressed()
、onPause()
或 onStop()
。如果我不能在之前的重写函数中中断它,我该如何在 TiltActivity
剩余时停止 Thread
。同样,Thread
未在 TiltActivity
中声明,这将使中断 Thread
变得容易得多。如果您需要进一步说明,请告诉我。
您需要向 TCP_IP_Client 添加一个方法来停止它声明和启动的线程。然后,您可以从您的 TitleActivity 对 TCP_IP_Client 的实例调用该方法(使用包含 TCP_IP_Client 实例的成员变量)。
假设您在 Thread
中有某种循环。
在 TiltActivity
中,您定义一个属性来保存对 Thread
的引用,并定义一个共享的 boolean
来让它知道它应该停止。
并且您提供了用于访问共享变量的同步方法。
在 onResume()
中创建并启动 Thread
,因此每次进入 activity 时都会重新创建它。在 onPause()
中,每次它即将离开前台时,你都会发出停止和中断它的信号;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class ThreadActivity extends AppCompatActivity {
public static final String TAG = ThreadActivity.class.getName();
boolean stopThread = false;
Thread t;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
startTheThread();
}
public synchronized boolean continueRunning(){
return !stopThread;
}
public synchronized void startTheThread(){
this.stopThread = false;
Toast.makeText(ThreadActivity.this,"Thread Starting",Toast.LENGTH_SHORT).show();
t = new Thread(new Runnable() {
@Override
public void run() {
while(continueRunning()){
try {
Thread.sleep(5000);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ThreadActivity.this,"Thread running",Toast.LENGTH_SHORT).show();
}
});
}catch (InterruptedException e){
;//do nothing
}
}
}
});
t.start();
}
public synchronized void stopTheThread(){
this.stopThread = true;
t.interrupt();
Toast.makeText(ThreadActivity.this,"Thread stopped",Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
stopTheThread();
}
}