2014-04-12 25 views
0

我试图在应用程序启动后每秒获取一次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(); 
} 
+0

好了,你不要有任何的循环'run()',所以线程在单次运行后结束。 – marcinj

+0

也调用'editLocation.setText(body);'是床的主意,你不应该从非UI线程修改UI。 – marcinj

回答

1

您只是启动一个正在执行代码的线程。你需要一个循环:

while(true){ 
//do your stuff 
sleep(1000) // to wait the second 
} 
+0

我想,和整个应用程序崩溃...... – Malluce

+0

@Malluce请张贴错误/堆栈跟踪,我们可以帮你 – Bolic

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(); 
} 

电话时,要停止检查

+0

我改变了这一点,但它崩溃时,它调用一个新的线程每隔一秒每次。 – Malluce

+0

@Malluce什么是logcat? – Farnabaz

0

所以checker.cancel();,我没有足够的代表评论什么Bolics回答:(看这个答案就像一个评论请

“我试过了,整个应用程序崩溃” - Malluce 这是因为当你在onCreate()中永久循环,应用程序不会执行任何其他操作。 因此,您需要按照Farnabaz的建议创建另一个线程。如果您想在主要活动中显示progressDialog,可以使用AsyncTask。如果您不需要在第二个线程中与主要活动“交流”,则可以简单地执行Farnabaz建议的操作。

(我写了这个解释你的错误和问题的答案。如果这是在是因为我没有任何“新”的事实皱起了眉头,请告诉我:))

+0

感谢您的意见!所以我确实尝试了Farnabaz的建议,但每当它每隔一秒调用一个新线程时就会崩溃。所以它会第一次运行,然后应用程序将崩溃。 – Malluce

+0

不知道我是否理解您的权利......您是否每秒创建一个新线程?不要这样做,只需在一个线程中运行循环。另外,logcat说什么? (耶我可以评论:)) – lucidbrot