Как загружать новые значения json каждые 10 секунд

Привет, люди, у меня возникают проблемы с получением моего последнего значения JSON каждые 10 секунд. Я разработал этот код и теперь застрял в нем. Когда я запускаю этот код, он показывает значение через секунду и не обновляется во второй раз. Я реализовал обработчик, но здесь он тоже не работает.

    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 секунд, а он этого не делает. Может ли кто-нибудь подсказать мне, как я могу сделать это возможным.

вы вызываете task.execute один раз, поэтому вы получаете json один раз. это плохая идея. возможно, вам нужно использовать веб-сокет или fcm, в зависимости от ваших потребностей

Siarhei 10.08.2018 15:35
0
1
128
3

Ответы 3

Попробуйте этот код ..

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

и метод callSyncData (), вызываемый в методе действия onCreate и методе запуска.

Это не работает :)

K132133 Syed Arsalan Hussain 10.08.2018 15:42

мой случай вызов API каждые 1 минуту

Android Team 10.08.2018 15:44

mHandler = новый обработчик (); это также определяется в методе onCreate.

Android Team 10.08.2018 15:45

Начну с того, что мне не нравится идея забивать сервер запросом каждые 10 секунд, даже если на самом деле ничего не меняется. Если вы можете перейти к решению с уведомлением с сервера, будет лучше.

Если вам все еще нужно это сделать, вы можете использовать три распространенных решения для запуска повторяющейся задачи с точкой:

1- Используйте Таймер и TimerTask

Для этого решения вам необходимо объявить свою задачу таймера для запуска:

    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. Настройка более проста и понятна, как показано ниже:

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    executor.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            //you stuff here
        }
    }, 0, 10, TimeUnit.SECONDS);

==> не забудьте выключить свой исполнитель, когда закончите, вызвав: executeor.shutdown ();

3- Используйте Обработчик

Совет здесь - повторно опубликовать runnable после загрузки вашего json, как упоминалось в предыдущем ответе.

Я не могу обновить свои значения edittext, я использовал все это.

K132133 Syed Arsalan Hussain 10.08.2018 17:51

имейте в виду, что вам может потребоваться использовать runOnUiThread, чтобы иметь возможность обновлять пользовательский интерфейс из фонового потока, например: `runOnUiThread (new Runnable () {@Override public void run () {// обновите текст здесь.}});`

Blake 10.08.2018 18:37

Вы можете использовать TimerTask и Timer. Если вам нужно обновить компоненты пользовательского интерфейса, вы должны запустить его в потоке пользовательского интерфейса.

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

Другие вопросы по теме