2012-11-30 2 views
0

내 문제는 마지막 시간입니다 : "java.lang.RuntimeException : Looper.prepare()"호출하지 않은 스레드 내부에서 처리기를 만들 수 없습니다. 그 후 HandlerThread를 수정하여 위치 업데이트 기능을 호출했습니다. 오류는 없지만 위치는 새로 고쳐지지 않습니다. 누구든지 조언을 해줄 수 있습니까?타이머에서 두 개의 작업을 개별적으로 실행하는 방법은 무엇입니까?

MyService.java (편집)을

public class MyService extends Service{ 

    int counter = 0; 
    static final int UPDATE_INTERVAL = 15000; 
    private Timer timer = new Timer(); 
    private Timer timer2 = new Timer(); 
    DefaultHttpClient httpclient; 
    HttpPost httppost; 
    String line,result; 
    HttpResponse response; 
    InputStream is; 
    BufferedReader reader; 
    StringBuilder sb; 
    final static String MY_ACTION = "MY_ACTION"; 
    LocationManager lm; 
    LocationListener locationListener; 
    String s = ""; 
    static final int READ_BLOCK_SIZE = 100; 
    List<NameValuePair> nameValuePairs; 
    private HandlerThread refreshThread = null; 


    @Override 
    public IBinder onBind(Intent arg0) { 
      // TODO Auto-generated method stub 
      return null; 
    } 


    public int onStartCommand(Intent intent, int flags, int startId){ 
      doSomethingRepeatedly(); 
      doUpdateLocation(); 
      return START_STICKY;     
    } 

    private void doSomethingRepeatedly(){ 
      timer.scheduleAtFixedRate(new TimerTask(){ 
        public void run(){ 
          ... 
        } 
      },10000,UPDATE_INTERVAL); 
    } 


    private void doUpdateLocation(){ 
     timer2.scheduleAtFixedRate(new TimerTask(){ 
      public void run(){ 
       onClickLoad(); 
       lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
          locationListener = new MyLocationListener(); 
          refreshThread = new HandlerThread("GPS Thread"); 
          refreshThread.start(); 
        new Handler(refreshThread.getLooper()).post(
        new Runnable() { 
        @Override 
       public void run() { 
         lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 1000, locationListener); 
        } 
       } 
      );                 
        } 
      },10000,UPDATE_INTERVAL); 
    } 


    private class MyLocationListener implements LocationListener{ 

       @Override 
       public void onLocationChanged(Location arg0) { 
         if(arg0!=null){ 
           final String lat = String.valueOf(arg0.getLatitude()); 
           final String lon = String.valueOf(arg0.getLongitude()); 

           new Thread(){ 
           public void run(){ 
             try{ 
              DefaultHttpClient httpclient = new DefaultHttpClient(); 
              HttpPost httppost = new HttpPost("http://www.kryptoquest.com/tracker/getLocation.php"); 
              ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); 
              nameValuePairs.add(new BasicNameValuePair("Username", s)); 
              nameValuePairs.add(new BasicNameValuePair("Latitude", lat)); 
              nameValuePairs.add(new BasicNameValuePair("Longitude", lon)); 
              Log.d("Latitude",lat); 
              Log.d("Longitude",lon); 
              httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
              httpclient.execute(httppost); 
             }catch(Exception e){ 
               Log.e("log_tag", "Error:"+e.toString()); 
             }   
           } 
         }.start(); 

         lm.removeUpdates(locationListener); 
         refreshThread.getLooper().quit(); 
         }     
       } 

       @Override 
       public void onProviderDisabled(String provider) { 
         // TODO Auto-generated method stub        
       } 

       @Override 
       public void onProviderEnabled(String provider) { 
         // TODO Auto-generated method stub        
       } 

       @Override 
       public void onStatusChanged(String provider, int status, Bundle extras) { 
         // TODO Auto-generated method stub        
       } 

     } 

    public void onClickLoad(){ 

       try 
       { 
         FileInputStream fIn = openFileInput("user.txt"); 
         InputStreamReader isr = new InputStreamReader(fIn); 

         char[] inputBuffer = new char[READ_BLOCK_SIZE];        

         int charRead; 
         while((charRead = isr.read(inputBuffer))>0) 
         { 
           String readString = String.copyValueOf(inputBuffer,0,charRead); 

           s += readString;          
           inputBuffer = new char[READ_BLOCK_SIZE]; 
         }        

       }catch(IOException ioe){ 
         ioe.printStackTrace(); 
       } 
     } 

    public void onDestroy(){ 
      super.onDestroy();     
      if(timer != null){ 
        timer.cancel(); 
      } 
      Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

'MyService.java : 125' 란 무엇입니까 ?? 백그라운드 스레드에서 UI 호출을 호출하고있는 것 같습니다. –

+0

MyService.java:125 >> lm.requestLocationUpdates (LocationManager.NETWORK_PROVIDER, 60000, 1000, locationListener); –

+0

처리기를 사용하여 이것을 호출하십시오! –

답변

0

이 작동 할 수 있습니다 : 다른 스레드에서 각 타이머를 실행 해보십시오.

0

을 참조하십시오. 사용하고있는 스레드에는 루퍼가 없습니다.

두 번째 스레드에 메시지를 보내는 데 사용할 첫 번째 스레드의 루퍼가 없으므로 첫 번째 스레드에서 생성 된 두 번째 스레드가 충돌을 일으 킵니다.

를 사용하여 안드로이드의 HandlerThread 대신 사용하여 스레드

http://developer.android.com/reference/android/os/HandlerThread.html

+0

코드를 편집했지만 아직 작동하지 않습니다. 위에서 편집 한 코드를 볼 수 있습니다 .. –

0

당신이, 당신이 다른 하나 개의 스레드에서 메시지를 보낼 수 있습니다 안드로이드에 처리기를 사용하며 메시지를 예약 할 수 있습니다.