一旦应用程序启动,我每隔一秒钟就会尝试获取GPS位置。目前我的代码如下:
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();
}
然而,它只运行一次(当应用程序启动时),它永远不会运行第二次。我正在使用秒来检查它是否定期运行。
更新: 这是我从logcat
获得的04-15 11:11:20.137:E / AndroidRuntime(16160):致命异常:Thread-3450 04-15 11:11:20.137:E / AndroidRuntime(16160):android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。 04-15 11:11:20.137:E / AndroidRuntime(16160):在android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6818) 04-15 11:11:20.137:E / AndroidRuntime(16160):在android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1112) 04-15 11:11:20.137:E / AndroidRuntime(16160):在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):在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):在android.widget.TextView $ ChangeWatcher.onSpanAdded(TextView.java:10686) 04-15 11:11:20.137:E / AndroidRuntime(16160):在android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979) 04-15 11:11:20.137:E / AndroidRuntime(16160):在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):在android.text.Selection.setSelection(Selection.java:127) 04-15 11:11:20.137:E / AndroidRuntime(16160):在android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302) 04-15 11:11:20.137:E / AndroidRuntime(16160):在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):在android.widget.EditText.setText(EditText.java:108) 04-15 11:11:20.137:E / AndroidRuntime(16160):在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();
}
答案 0 :(得分:1)
您只是启动一次执行代码的线程。你需要一个循环:
while(true){
//do your stuff
sleep(1000) // to wait the second
}
答案 1 :(得分:1)
我认为这就是你想要的
Thread checker ;
public void getLocation() {
Runnable runnable = new Runnable() {
public void run() {
Calendar c = Calendar.getInstance();
while(true){ // loop forever and check GPS location
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();
}
}// end while
};
};
checker = new Thread(runnable).start();
}
如果您想停止检查
,请致电checker.cancel();
答案 2 :(得分:0)
所以,我还没有足够的代表对Bolics的答案发表评论:(请看这个答案就像评论一样。
"我试过了,整个应用程序崩溃了#34; - 马鲁克斯 这是因为当您在onCreate()中永远循环时,应用程序不会执行任何其他操作。 因此,你需要创建另一个Thread,正如Farnabaz建议的那样。如果您想在主要活动中显示progressDialog,可以使用AsyncTask。如果您不需要进行“沟通”。通过第二个Thread中的主要活动,你可以简单地做Farnabaz所建议的。
(我写这篇文章是为了解释你的错误和答案。如果这是不赞成的,因为我没有"新的"事实,请告诉我:))