2016-11-09 109 views
1

我嘗試運行此代碼以從我的數據庫中獲取用戶的狀態。該過程包含JSON,因此我創建了一個新的類來實現Runnable作爲後臺服務。我確實創建了一個類extends Service。在該服務中,我稱之爲線程。我使用處理程序並使用postDelayed重複該線程。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; 
} 

我相信我的代碼這裏有重複BackgroundThread.class實現Runnable

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

但線程只會發生一次

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

我需要線程運行重複檢查用戶的狀態。我一直在搜索互聯網,大多數網站都建議使用計時器或處理程序來實現這一目標。理解它我錯了嗎?我是android studio的新手。謝謝@Blackbelt –

+0

postDelayed發佈一次可運行一次。如果你想多次發佈,你可以運行postrelayed再次。雖然這樣做與線程的結合是一種至少可以說的氣味 - 你可能不應該擁有runnable,並且應該只有一個無限循環的線程。 –

回答

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; 
} 
相關問題