私はJavaを初めて使い、定期的に私のUbidots変数からいくつかの情報を読み込むAndroidのAPPを作ろうとしています。Java ScheduledExecutorServiceは一度だけ実行されます
問題は、それが一度だけ実行されるということです私はそれをやって、この方法を見つけるために管理し、オンラインでいくつかの研究の後..
。最初の反復後、再びsyncTimerを通過することはありません。
Runnable syncTimer = new Runnable() {
public void run() {
ubi.execute(0);
if (!syncComplete)
{
System.out.println("Sync not completed. We'll wait");
while (!syncComplete)
{
//wait.
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
try
{
syncComplete(tempValue, g_tempVal.toString());
}
catch (Exception e)
{
System.err.println("error in executing. It will no longer be run!");
e.printStackTrace();
throw new RuntimeException(e);
}
}
});
}
};
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(syncTimer, 0, 2, TimeUnit.SECONDS);
これは私のコードですが、この問題の原因は何ですか?私はそれを解決する方法を見つけるためにgoogle上で何を検索するのか、アイデアのすべてです。
私はJava/Androidでプログラミングしたことがなく、他の言語のみを使用しています。
syncCompleteは、Ubidotsに接続して変数を取得するAsyncTaskの後に設定されるブール値です。
public class ApiUbidots extends AsyncTask<Integer, Void, Void> {
private final String API_KEY = "key";
private final String VARIABLE_ID = "var";
@Override
protected Void doInBackground(Integer... params) {
ApiClient apiClient = new ApiClient(API_KEY);
Variable temperature = apiClient.getVariable(VARIABLE_ID);
if (params[0] == 0)
{
g_tempVal = temperature.getValues()[0].getValue();
syncComplete = true;
}
if (params[0] == 1)
{
//implement write function
}
return null;
}
}
あなたは永遠に実行されます。あなたがそれをブロックしてから、スレッドは再利用することさえできません。 – Nathan
いいえ、私は説明では、Ubidotsのデータが受信されたら、私はそれを真に設定していると言いました...私はそれを確認しました、ここでは問題ではありません。 –