Android 当片段中的某个线程被销毁时终止背景线程
我有一个片段,它有一个后台线程,当进度值达到某个值时,当我尝试在同一活动中的另一个片段上启动时,更新进度条值并更改可绘制的进度条。如果发生此错误Android 当片段中的某个线程被销毁时终止背景线程,android,multithreading,android-fragments,Android,Multithreading,Android Fragments,我有一个片段,它有一个后台线程,当进度值达到某个值时,当我尝试在同一活动中的另一个片段上启动时,更新进度条值并更改可绘制的进度条。如果发生此错误 E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.support.v4.app.FragmentActivity.getResources()'
E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.support.v4.app.FragmentActivity.getResources()' on a null object reference
at com.example.mego.adas.ui.CarFragment$PotProgressThread$1.run(CarFragment.java:831)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7409)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.mego.adas, PID: 25935
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.support.v4.app.FragmentActivity.getResources()' on a null object reference
at com.example.mego.adas.ui.CarFragment$PotProgressThread$1.run(CarFragment.java:831)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7409)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
下面是线程的代码
class PotProgressThread implements Runnable {
@Override
public void run() {
while (potSensorValue <= 1025 && fragmentIsRunning) {
if (fragmentIsRunning) {
// Update the progress bar
potProgressBarHandler.post(new Runnable() {
public void run() {
potProgressBar.setProgress((int) potSensorValue);
if (potSensorValue >= 800) {
potProgressBar.setProgressDrawable(getActivity().
getResources().getDrawable(R.drawable.progressbarred));
} else {
potProgressBar.setProgressDrawable(getActivity().
getResources().getDrawable(R.drawable.progressbarblue));
}
}
});
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
下面是onDestoryview()方法的代码
我如何杀死它Dalvik在运行时保留所有线程引用,这样您的线程将继续运行,除非它被终止或完成(一些)。因此,根据线程的起始位置,您可能会创建多个线程 在您的情况下,线程执行未完成,您更改了片段,因此
getActivity()
将为空
解决方案在getActivity()
之前,请检查isAdded()
是否为true,如果为true,则表示片段已分离,调用getActivity()
将返回null
请记住,在线程中,在调用getActivity()
之前,您最好再次检查isAdded(),因为在线程执行期间,用户可能随时退出活动
其他解决方案
我不确定,但可以通过全局初始化上下文
并在线程中创建该上下文来实现
Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
mContext = getActivity();
....
}
class PotProgressThread implements Runnable {
@Override
public void run() {
while (potSensorValue <= 1025 && fragmentIsRunning) {
if (fragmentIsRunning) {
// Update the progress bar
potProgressBarHandler.post(new Runnable() {
public void run() {
potProgressBar.setProgress((int) potSensorValue);
if (potSensorValue >= 800) {
potProgressBar.setProgressDrawable(mContext.
getResources().getDrawable(R.drawable.progressbarred));
} else {
potProgressBar.setProgressDrawable(mContext.
getResources().getDrawable(R.drawable.progressbarblue));
}
}
});
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
现在在线程中使用此上下文
Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
mContext = getActivity();
....
}
class PotProgressThread implements Runnable {
@Override
public void run() {
while (potSensorValue <= 1025 && fragmentIsRunning) {
if (fragmentIsRunning) {
// Update the progress bar
potProgressBarHandler.post(new Runnable() {
public void run() {
potProgressBar.setProgress((int) potSensorValue);
if (potSensorValue >= 800) {
potProgressBar.setProgressDrawable(mContext.
getResources().getDrawable(R.drawable.progressbarred));
} else {
potProgressBar.setProgressDrawable(mContext.
getResources().getDrawable(R.drawable.progressbarblue));
}
}
});
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
类PotProgressThread实现可运行{
@凌驾
公开募捐{
而(potSensorValue=800){
potProgressBar.setProgressDrawable(mContext)。
getResources().getDrawable(R.drawable.progressbarred));
}否则{
potProgressBar.setProgressDrawable(mContext)。
getResources().getDrawable(R.drawable.progressbarblue));
}
}
});
试一试{
睡眠(50);
}捕捉(中断异常e){
e、 printStackTrace();
}
}否则{
打破
}
}
}
}
我希望您能得到解决方案。请分享您的
onCreateView()
method code.ok我会编辑问题完成检查..错误发生在我离开片段并转到另一个片段时ok非常感谢这一点第一个解决方案对我来说很好我没有尝试第二个,但我认为它不会起作用,因为错误发生在我转到其他片段时,而不是在我启动此片段时