我试图在应用程序启动后每秒获取一次GPS位置。目前,我有我的代码如下所示:在OnCreate中定期运行方法
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editLocation = (EditText) findViewById(R.id.editTextLocation);
btnGetLocation = (Button) findViewById(R.id.btnLocation);
btnGetLocation.setOnClickListener(this);
gps = new GPSTracker(GetCurrentLocation.this);
getLocation();
}
public void getLocation() {
Calendar c = Calendar.getInstance();
final int seconds = c.get(Calendar.SECOND);
Runnable runnable = new Runnable() {
public void run() {
try {
if (gps.canGetLocation()) {
latitude = gps.getLatitude();
longitude = gps.getLongitude();
}
String body = latitude + "\t" + longitude + "\t" + seconds;
editLocation.setText(body);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
};
new Thread(runnable).start();
}
但是,它只能运行一次(应用程序启动时),它永远不会运行第二次。我使用秒来检查它是否定期运行。
UPDATE: 这是我从logcat的
04-15拿到11:11:20.137:E/AndroidRuntime(16160):致命异常:螺纹3450 04-15 11:11: 20.137:E/AndroidRuntime(16160):android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触及其视图。 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6818) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1112) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.view.ViewGroup.invalidateChild(ViewGroup.java:4484) 04-15 11:11:20.137:E/AndroidRuntime(16160):在android.view.View.invalidate(View.java:11353) 04-15 11:11:20.137:E/AndroidRuntime(16160):在android.widget。 TextView.invalidateRegion(TextView.java:5378) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.widget.TextView.invalidateCursor(TextView.java:5321) 04-15 11:11: 20.137:E/AndroidRuntime(16160):在android.widget.TextView.spanChange(TextView.java:8581) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.widget.TextView $ ChangeWatcher.onSpanAdded(TextView.java:10686) 04-15 11:11:20.137:E/AndroidRuntime(16160) :at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:688) 04 -15 11:11:20.137:E/AndroidRuntime(16160):在android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588) 04-15 11:11:20.137:E/AndroidRuntime(16160):在android。 text.Selection.setSelection(Selection.java:116) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.text.Selection.setSelection(Selection.java:127) 04-15 11: 11:20.137:E/AndroidRuntime(16160):在android.text.method.ArrowKeyMovementMetho d.initialize(ArrowKeyMovementMethod.java:302) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.widget.TextView.setText(TextView.java:4434) 04-15 11:11: 20.137:E/AndroidRuntime(16160):在android.widget.TextView.setText(TextView.java:4283) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.widget.EditText.setText EditText.java:108) 04-15 11:11:20.137:E/AndroidRuntime(16160):at android.widget.TextView.setText(TextView.java:4258) 04-15 11:11:20.137:E/AndroidRuntime(16160):at com.yc.test.GetCurrentLocation $ 1.run(GetCurrentLocation.java:60) 04-15 11:11:20.137:E/AndroidRuntime(16160):at java.lang.Thread.run(Thread .java:841)
和修改后的代码:
Thread checker;
public void getLocation() {
Runnable runnable = new Runnable() {
public void run() {
Calendar c = Calendar.getInstance();
while (true) {
int seconds = c.get(Calendar.SECOND);
try {
if (gps.canGetLocation()) {
latitude = gps.getLatitude();
longitude = gps.getLongitude();
}
String body = latitude + ", \t" + longitude + "\t"
+ seconds;
editLocation.setText(body);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
};
checker = new Thread(runnable);
checker.start();
}
好了,你不要有任何的循环'run()',所以线程在单次运行后结束。 – marcinj
也调用'editLocation.setText(body);'是床的主意,你不应该从非UI线程修改UI。 – marcinj