2016-11-09 9 views
1

이 코드를 실행하여 데이터베이스에서 사용자의 상태를 가져 오려고합니다. 이 프로세스에는 JSON이 포함되어 있으므로 Runnable을 구현하는 새 클래스를 백그라운드 서비스로 사용하도록 만듭니다. 클래스 확장 서비스를 만들었습니다. 그 서비스에서 나는 실을 호출한다. 나는 핸들러를 사용하고 postDelayed를 사용하여 스레드를 반복한다. 내 코드는 여기에 BackgroundThread.class 반복을 위해 있다고 생각postdelayed 처리기가 실행 파일을 반복하지 않습니다

public int onStartCommand(Intent intent, int flags, final int startId) { 

Toast.makeText(this,"SESSION START",Toast.LENGTH_SHORT).show(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     new Thread(new BackgroundThread(startId)).start(); 
    } 
},1000); 

return START_STICKY; 
} 

public class BackgroundThread implements Runnable { 
int service_id; 
int mark=-1; 

public BackgroundThread(int service_id) { 
    this.service_id=service_id; 
} 

@Override 
public void run() { 
    JSONData jsonData = new JSONData(); 
    if (jsonData.getJSONstring() == 1 && mark != 1) { 
     Log.e("STATUS", "" + jsonData.getJSONstring()); 
     mark = 1; 
    } else if (jsonData.getJSONstring() == 0 && mark != 0) { 
     Log.e("STATUS", "" + jsonData.getJSONstring()); 
     mark = 0; 
    } 
    Log.d("RUNNING","RUNNING"); 
} 
} 

Runnable를 구현하지만

11-09 23:38:56.683 6483-6526/com.example.asus.intentservice I/OpenGLRenderer﹕ Initialized EGL, version 1.4 
11-09 23:38:58.743 6483-6526/com.example.asus.intentservice V/RenderScript﹕ 0xa34ed000 Launching thread(s), CPUs 4 
11-09 23:38:59.642 6483-6745/com.example.asus.intentservice W/System﹕ ClassLoader referenced unknown path: /system/framework/tcmclient.jar 
11-09 23:38:59.968 6483-6745/com.example.asus.intentservice E/STATUS﹕ 0 
11-09 23:38:59.968 6483-6745/com.example.asus.intentservice D/RUNNING﹕ RUNNING 

내 코드에 문제가되면 스레드는 어떻게됩니까? 아니면 내 목적을 달성하기위한 대안이있을 수 있습니다. 그러나 누군가가 내 코드를 수정하도록 도와 줄 수 있으면 더 좋습니다. 대단히 감사합니다.

+0

* 내 코드에 문제가 * '예? - 한 번만 게시물 postDelayed. 무엇을 성취하려고합니까? – Blackbelt

+0

사용자의 상태를 반복적으로 점검하기 위해 스레드가 필요합니다. 나는 인터넷을 검색해 왔으며 대부분의 웹은이를 달성하기 위해 타이머 나 처리기를 사용할 것을 제안합니다. 그것을 이해하는 것이 잘못 되었습니까? 나는 안드로이드 스튜디오가 처음이에요. Thanks @Blackbelt –

+0

postDelayed는 단 한번의 실행 파일을 한번 게시합니다. 여러 번 게시하려면 실행 가능한 postDelayed 자체가 다시 있어야합니다. 이 작업을 스레드와 조합하는 것이 냄새라고 말할 수는 있지만 실행 파일이 없어야하며 무한 루프 스레드가 있어야합니다. –

답변

0

다른 사람들이 설명한 postDelayed에 대한 더 나은 이해를 얻은 후에, 대체 코드를 찾고 Android run thread in service every X seconds 에서이 코드를 사용해보십시오. 내 질문이 나 같은 손실 다른 희망이 도움이 내 새로운 코드

public int onStartCommand(Intent intent, int flags, final int startId) { 

Toast.makeText(this,"SESSION START",Toast.LENGTH_SHORT).show(); 
    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     @Override 
     public void run() { 
      new Thread(new BackgroundThread(startId)).start(); 
     } 
    },0,2, TimeUnit.SECONDS); 
return START_STICKY; 
}