Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当片段中的某个线程被销毁时终止背景线程_Android_Multithreading_Android Fragments - Fatal编程技术网

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非常感谢这一点第一个解决方案对我来说很好我没有尝试第二个,但我认为它不会起作用,因为错误发生在我转到其他片段时,而不是在我启动此片段时