在OnCreate中定期运行方法

时间:2014-04-12 21:43:11

标签: android

一旦应用程序启动,我每隔一秒钟就会尝试获取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();
}

3 个答案:

答案 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所建议的。

(我写这篇文章是为了解释你的错误和答案。如果这是不赞成的,因为我没有"新的"事实,请告诉我:))