我想有一些东西,我只是还没有得到关于这些意见是如何编码。这是第三次我不得不来张贴一个问题rearding他们在过去3天!:S
不管怎样,我的问题是这样的。
- edit:* 这 * 是 * 方法 * 内的代码,* 按下按钮时执行该代码:(重点已注明)
>> setContentView(R.layout.stop);
>> timer = (TextView) findViewById(R.id.timer2);
GPSMain.button = (Button) findViewById(R.id.stopbutton);
startService(new Intent(context, Timer.class));
}
这是在"startService"调用中执行的Timer类:(再次指出重要的几点)
public class Timer extends Service {
static int totalSeconds = 0;
private int hour = 0;
private int min = 0;
private int sec = 0;
String mTimeFormat = "%02d:%02d:%02d";
final private Handler mHandler = new Handler();
static String timeTaken;
Context context = this;
Runnable mUpdateTime = new Runnable() {
public void run() { updateTimeView(); }
};
@Override
public void onCreate() {
Toast.makeText(context, "Timer Started", Toast.LENGTH_LONG).show();
mHandler.postDelayed(mUpdateTime, 1000);
}
public void updateTimeView() {
totalSeconds += 1;
sec += 1;
if(sec >= 60) {
sec = 0;
min += 1;
if (min >= 60) {
min = 0;
hour += 1;
}
}
>> timeTaken = String.format(mTimeFormat, hour, min, sec);
>> GPSMain.timer.setText("Time Taken: "+timeTaken);
mHandler.postDelayed(mUpdateTime, 1000);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
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>
更新!
MyTimer类:
@SuppressWarnings("unchecked")
public class MyTimer extends AsyncTask {
Timer _timerTask = new Timer();
static int totalSeconds = 0, hour = 0, min = 0, sec = 0;
static String mTimeFormat = "%02d:%02d:%02d";
static String timeTakenString;
@Override
protected Object doInBackground(Object... params) {
TimerTask timer = new TimerTask() {
@Override
public void run() {
totalSeconds += 1;
sec += 1;
if(sec >= 60) {
sec = 0;
min += 1;
if (min >= 60) {
min = 0;
hour += 1;
}
}
timeTakenString = String.format(mTimeFormat, hour, min, sec);
GPSMain.timer.setText("Time Taken: "+GPSMain.timeTaken);
}
};
(_timerTask).scheduleAtFixedRate(timer,1000,1000);
return null;
}
}
启动定时器线程的方法:
void startService(){
setContentView(R.layout.stop);
timer = (TextView) findViewById(R.id.timer2);
GPSMain.button = (Button) findViewById(R.id.stopbutton);
new MyTimer().execute();
}
3条答案
按热度按时间2wnc66cl1#
为什么你需要一个
Service
?为什么你不直接使用AsyncTask
?服务通常是当你需要在后台运行一些东西时使用的,不向用户显示布局。你的应用程序向用户显示数据,所以解决你的问题的最好方法是运行一个单独的线程,而不是一个服务。希望这能有所帮助。wz8daaqr2#
您可以使用TimerTask代替Service。下面是代码。
uqdfh47h3#
嗯,我真的不太了解服务,但是在任何情况下,您都应该只从UI线程访问UI。
在你的情况下,我觉得有按钮的活动和服务是两个不同的类,服务不拥有任何活动的对象。我认为你从服务设置文本视图的方式可能是一个问题。但同样,我对服务了解不多。
另一方面,我同意Egor的观点,除非你有很多活动,而且每个人都在做很多网络活动,否则AsyncTask是一条可行之路。