如何每10秒载入JSON新值

时间:2018-08-10 13:29:45

标签: android

嗨,我每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秒刷新一次我的值,但它没有这样做。 任何人都可以指导我如何实现这一目标。

3 个答案:

答案 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秒钟对服务器进行一次请求锤打的想法,甚至没有任何改变。如果您可以使用服务器发出的通知转到解决方案,那就更好了。

如果您仍然需要这样做,则可以使用三种常见的解决方案来触发带有周期的重复任务:

1- 使用TimerTimerTask

对于此解决方案,您需要声明要运行的计时器任务:

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