嗨,我每10秒要获取最新的JSON值时遇到问题。我已经开发了这段代码,现在却陷入其中。当我运行此代码时,它将显示秒后的值,并且第二次未更新。我已经实现了处理程序,但它在这里也无法正常工作。
public class MainActivity extends AppCompatActivity {
TextView a,b,c,d,e,f,g,h;
String result = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
a=(TextView) findViewById(R.id.a);
b=(TextView) findViewById(R.id.b);
c=(TextView) findViewById(R.id.c);
DownloadTask task = new DownloadTask();
task.execute("https://api.thingspeak.com/channels/12345/feeds.json?results=1");
}
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
data = reader.read();
}
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(final String result) {
super.onPostExecute(result);
new Handler().postDelayed(new Runnable() {
public void run() {
search(result);
}
}, 10000);
}
public void search(String result){
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray weatherInfo = jsonObject.getJSONArray("feeds");
JSONObject legsobject = weatherInfo.getJSONObject(0);
a.setText(legsobject.getString("field1"));
b.setText(legsobject.getString("field2"));
c.setText(legsobject.getString("field3"));
}catch (JSONException e) {
e.printStackTrace();
}
}
}
}
我想每10秒刷新一次我的值,但它没有这样做。 任何人都可以指导我如何实现这一目标。
答案 0 :(得分:0)
尝试此代码..
private final int INTERVAL_MILLI = 60000; // define your time..
Handler mHandler;
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(SyncData);
}
Runnable SyncData = new Runnable() {
@Override
public void run() {
// call your code here..
Log.e(TAG, "SyncData1: " + new java.sql.Date(System.currentTimeMillis()).toString());
final String Token = AppSetting.getStringSharedPref(mContext, Constants.USER_KEY_TOKEN, "");
if (!TextUtils.isEmpty(Token) && !CommonUtils.isServiceRunning(mContext)) {
Log.e(TAG, "SyncData2: " + new java.sql.Date(System.currentTimeMillis()).toString());
startService(new Intent(mContext, SyncService.class));
}
callSyncData();
}
};
public void callSyncData()
{
mHandler.postDelayed(SyncData, INTERVAL_MILLI);
}
和在活动onCreate方法和run方法中调用的callSyncData()方法。
答案 1 :(得分:0)
首先,我不喜欢每隔10秒钟对服务器进行一次请求锤打的想法,甚至没有任何改变。如果您可以使用服务器发出的通知转到解决方案,那就更好了。
如果您仍然需要这样做,则可以使用三种常见的解决方案来触发带有周期的重复任务:
对于此解决方案,您需要声明要运行的计时器任务:
final TimerTask repeatedTask = new TimerTask() {
@Override
public void run() {
//you stuff here
}
};
然后,您需要使用如下计时器来安排任务:
final Timer timer = new Timer();
timer.scheduleAtFixedRate(repeatedTask,0, 10 * 1000);
==>不要忘记调用timer.cancel();。完成后(或活动暂停,停止...)
2- 使用ScheduledThreadPoolExecutor
这基本上是从Android 5.0开始的Timer任务的替代。设置更加简单明了,如下所示:
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//you stuff here
}
}, 0, 10, TimeUnit.SECONDS);
==>不要忘了通过调用executor.shutdown();关闭执行器。
3- 使用Handler
这里的提示是像上一个答案中提到的那样,在下载json之后重新发布可运行对象。
答案 2 :(得分:0)
您可以使用TimerTask和Timer。如果需要更新UI组件,则应在UI线程上运行它。
final TimerTask yourRepeatedTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
//your code here
}
});
}
};
还有一个计时器,可以在给定的时间间隔内安排您的任务。您的情况是10秒。确保以毫秒为单位。
final Timer timer = new Timer();
timer.scheduleAtFixedRate(yourRepeatedTask ,0, 10 * 1000);
最后一次调用timer.cancel()以停止计时器。
@Override
protected void onPause() {
if (timer != null) {
timer.cancel();
}
super.onPause();
}