Android 视图出现NullPointerException问题

Android 视图出现NullPointerException问题,android,view,timer,nullpointerexception,Android,View,Timer,Nullpointerexception,我想我还没有弄清楚这些视图是如何编码的。这是我在过去三天里第三次来发帖问他们 无论如何,我的问题如下 编辑: 这是一个方法中的代码,该方法在按下按钮时执行: (注意要点) 这是在“startService”调用中执行的计时器类: (再次指出了重要事项) logcat在以下代码行上返回NullPointerException: GPSMain.timer.setText("Time Taken: "+timeTaken); 如果我删除了那行代码,代码就正确地执行了*,我说正确是因为它一直执行到应

我想我还没有弄清楚这些视图是如何编码的。这是我在过去三天里第三次来发帖问他们

无论如何,我的问题如下

编辑: 这是一个方法中的代码,该方法在按下按钮时执行: (注意要点)

这是在“startService”调用中执行的计时器类: (再次指出了重要事项)

logcat在以下代码行上返回NullPointerException:

GPSMain.timer.setText("Time Taken: "+timeTaken);
如果我删除了那行代码,代码就正确地执行了*,我说正确是因为它一直执行到应用程序代码的末尾,但我想在计时器计数时将其打印到屏幕上的原因是因为我需要确保它正常工作

*它不仅可以正常运行,还可以显示计时器文本视图,其中包含xml中默认定义的字符串。只有当我试图从java更新它时,它才会崩溃

下面是代码此时引用的完整xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
    android:id="@+id/stopbutton"
    android:layout_width="100px" 
    android:layout_height="100px" 
    android:text="Stop"
    android:layout_centerInParent="true"
/>
<TextView  
    android:id="@+id/timer2"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Time Taken:       unknown"
    android:layout_below="@+id/timer"
    />
</RelativeLayout>
启动计时器线程的方法:

void startService(){

    setContentView(R.layout.stop);

    timer = (TextView) findViewById(R.id.timer2);

    GPSMain.button = (Button) findViewById(R.id.stopbutton);

    new MyTimer().execute();

}

您为什么需要这里的
服务
?为什么不直接使用
AsyncTask
?当您需要在后台运行某些东西时,通常会使用服务,而不会向用户显示布局。应用程序向用户显示数据,所以解决问题的最佳方法是运行单独的线程,而不是服务。希望这有帮助。

您为什么需要这里的
服务?为什么不直接使用
AsyncTask
?当您需要在后台运行某些东西时,通常会使用服务,而不会向用户显示布局。应用程序向用户显示数据,所以解决问题的最佳方法是运行单独的线程,而不是服务。希望这有帮助。

您可以使用TimerTask而不是Service。这是密码

TimerTask timer = new TimerTask() {

            @Override
            public void run() {

                        // Here you can update your UI
    }
 }

Timer _timerTask = new Timer();
        _timerTask.scheduleAtFixedRate(timer,60000,60000);

您可以使用TimerTask而不是Service。这是密码

TimerTask timer = new TimerTask() {

            @Override
            public void run() {

                        // Here you can update your UI
    }
 }

Timer _timerTask = new Timer();
        _timerTask.scheduleAtFixedRate(timer,60000,60000);

嗯,我真的不太了解服务,但在所有情况下,您都应该只从UI线程访问UI

在您的情况下,我觉得有按钮的活动和服务是两个不同的类,服务没有任何活动对象。
我认为您从服务设置文本视图的方式可能是一个问题。不过,我对服务业了解不多

另一方面,我同意Egor的观点,除非你有很多活动,而且每个人都在做大量的网络活动,否则AsyncTask是一个不错的选择


希望能有所帮助。

嗯,我真的不太了解服务,但在所有情况下,您都应该只从UI线程访问UI

在您的情况下,我觉得有按钮的活动和服务是两个不同的类,服务没有任何活动对象。
我认为您从服务设置文本视图的方式可能是一个问题。不过,我对服务业了解不多

另一方面,我同意Egor的观点,除非你有很多活动,而且每个人都在做大量的网络活动,否则AsyncTask是一个不错的选择


希望能有帮助。

啊,我从没想过要这么做。老实说,我对线程不是很在行,所以也许这就是原因。我会调查的,如果这解决了我的问题,我会接受你的回答:)谢谢你的帮助!!不客气!您应该看看AsyncTask类,它提供了对多线程的非常简单的访问,并帮助您与UI线程同步以重新绘制视图。祝你好运谢谢现在看看它,看看我是否能用下面的代码实现它:啊,我从来没想过要这么做。老实说,我对线程不是很在行,所以也许这就是原因。我会调查的,如果这解决了我的问题,我会接受你的回答:)谢谢你的帮助!!不客气!您应该看看AsyncTask类,它提供了对多线程的非常简单的访问,并帮助您与UI线程同步以重新绘制视图。祝你好运谢谢现在来看一下,看看我是否可以用下面发布的代码来实现它:当我尝试输入代码时,我遇到了这个错误:scheduleAtFixedRate(TimerTask,int,int)方法对于Timer类型是未定义的eclipse给了我以下提示:1。创建方法scheduleAtFixedRate(TimerTask,int,int)或2。将cast添加到_timertask还没有,应用程序会一直运行到最后,但我认为异步任务不会得到执行。。。现在输入代码我在尝试输入您的代码时遇到了这个错误:Timer eclipse给我的提示是:类型scheduleAtFixedRate(TimerTask,int,int)的方法没有定义。创建方法scheduleAtFixedRate(TimerTask,int,int)或2。将cast添加到_timertask还没有,应用程序会一直运行到最后,但我认为异步任务不会得到执行。。。现在就开始编写代码是的,我正在尝试实现它,但我认为它没有执行,现在在我的主要问题中发布代码
doInBackground()
没有在UI线程中运行,它是一个后台工作线程,因此您无法从它或从它启动的任何子线程访问TextView。AsyncTask使用方法
onPostExecute()
在UI上执行操作。此示例代码可能会帮助您完成异步任务:啊,谢谢!我不知道!对于新手程序员来说,这是一个非常棒的网站!:)是的,我正在尝试实现它,但我认为它没有执行,现在在我的主要问题中发布代码
doInBackground()
没有在UI线程中运行,它是一个后台工作线程,因此您无法从它或从它启动的任何子线程访问TextView。AsyncTask使用方法
onPostExecute()
在UI上执行操作。此示例代码可能会帮助您完成异步任务:啊,谢谢!我不知道!对于新手程序员来说,这是一个非常棒的网站!:)
void startService(){

    setContentView(R.layout.stop);

    timer = (TextView) findViewById(R.id.timer2);

    GPSMain.button = (Button) findViewById(R.id.stopbutton);

    new MyTimer().execute();

}
TimerTask timer = new TimerTask() {

            @Override
            public void run() {

                        // Here you can update your UI
    }
 }

Timer _timerTask = new Timer();
        _timerTask.scheduleAtFixedRate(timer,60000,60000);