title: Android: Refresh ListView every minute
body: <p>I've been reading all day threads regarding this issue I came up with a strategy but can't make it work</p>
  
  <p>I have a listview fetching json data from a sql server
  this listview already has a on swipe refresh function</p>
  
  <p>I need this listview to refresh automatically only when new row was inserted in the data base.</p>
  
  <p>So I wrote a php file fetching number of rows and echoing it witha  3 second refresh (on the php itself) so every time I enter the php file I get the realtime row numbers of my table.</p>
  
  <p>I'm trying to build a function inside my MainActivity:</p>
  
  <pre><code>int OldNumberOfRows = data from the php file
  while(true){
  int newNumberOfRows = fetch data again using that php
  if(both arent equal) execute refresh command.
  }
  </code></pre>
  
  <p>Note: I got no idea how to extract the string from my asynctask to start manipulating my code with it.</p>
  
  <p>That's it in general, Iv'e added the main activity , the "outer class" (FetchNumRowAsync) calling that php the swipe class and the php itself</p>
  
  <p>MainActivity:</p>
  
  <pre><code>public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
  
      private String TAG = MainActivity.class.getSimpleName();
  
      private String URL = "http://troyka.esy.es/troyka/orders.php";
  
  
      private SwipeRefreshLayout swipeRefreshLayout;
      private ListView listView;
      private SwipeListAdapter adapter;
      private List&lt;Order&gt; orderList;
  
      // initially offset will be 0, later will be updated while parsing the json
      private int offSet = 0;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          new FetchRowNumAsync(this).execute("http://troyka.esy.es/numberofrows.php");
  
          listView = (ListView) findViewById(R.id.listView);
          //RelativeLayout.LayoutParams layout_description = new RelativeLayout.LayoutParams(50,10);
  
          //Rl.setLayoutParams(layout_description);
  
          swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
  
          orderList = new ArrayList&lt;&gt;();
          adapter = new SwipeListAdapter(this, orderList);
          listView.setAdapter(adapter);
  
          swipeRefreshLayout.setOnRefreshListener(this);
  
          /**
           * Showing Swipe Refresh animation on activity create
           * As animation won't start on onCreate, post runnable is used
           */
          swipeRefreshLayout.post(new Runnable() {
                                      @Override
                                      public void run() {
                                          swipeRefreshLayout.setRefreshing(true);
  
                                          fetchOrders();
                                      }
                                  }
          );
  
      }
  
      /**
       * This method is called when swipe refresh is pulled down
       */
  
  
      @Override
      public void onRefresh() {
          fetchOrders();
      }
  
      /**
       * Fetching movies json by making http call
       */
      private void fetchOrders() {
  
          // showing refresh animation before making http call
          swipeRefreshLayout.setRefreshing(true);
  
          // appending offset to url
          String url = URL + offSet;
  
          // Volley's json array request object
          JsonArrayRequest req = new JsonArrayRequest(url,
                  new Response.Listener&lt;JSONArray&gt;() {
                      @Override
                      public void onResponse(JSONArray response) {
                          Log.d(TAG, response.toString());
  
                          if (response.length() &gt; 0) {
  
                              // looping through json and adding to order list
                              for (int i = 0; i &lt; response.length(); i++) {
                                  try {
                                      JSONObject orderObj = response.getJSONObject(i);
  
                                      int rank = orderObj.getInt("rank");
                                      String title = orderObj.getString("title");
  
                                      Order m = new Order(rank, title);
  
                                      orderList.add(0, m);
  
                                      // updating offset value to highest value
                                      if (rank &gt;= offSet)
                                          offSet = rank;
  
                                  } catch (JSONException e) {
                                      Log.e(TAG, "JSON Parsing error: " + e.getMessage());
                                  }
                              }
  
                              adapter.notifyDataSetChanged();
                          }
  
                          // stopping swipe refresh
                          swipeRefreshLayout.setRefreshing(false);
  
                      }
                  }, new Response.ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError error) {
                  Log.e(TAG, "Server Error: " + error.getMessage());
  
                  Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
  
                  // stopping swipe refresh
                  swipeRefreshLayout.setRefreshing(false);
              }
          });
  
          // Adding request to request queue
          MyApplication.getInstance().addToRequestQueue(req);
      }
  
  }
  </code></pre>
  
  <p>FetchRowNumAsync:</p>
  
  <pre><code>public class FetchRowNumAsync extends AsyncTask&lt;String, Void, String&gt;  {
  
      private Context mContext;
  
      public FetchRowNumAsync(Context ctx){
          this.mContext = ctx;
      }
  
      protected String doInBackground(String... urls)
      {
          String fullString = "";
          try{
              URL url = new URL(urls[0]);
              BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
              String line;
              while ((line = reader.readLine()) != null) {
                  fullString += line;
              }
              reader.close();
          }catch(Exception e ){
              e.getMessage();
          }
          return fullString;
      }
  
      @Override
      protected void onPostExecute(String value){
          try{
              ((OnValueFetchedListener) mContext).onValueFetched(value);
          }catch(ClassCastException e){}
      }
  
      public interface OnValueFetchedListener{
          void onValueFetched(String columns);
      }
  
  }
  </code></pre>
  
  <p>SwipeListAdapter:</p>
  
  <pre><code>   public class SwipeListAdapter extends BaseAdapter {
          private Activity activity;
          private LayoutInflater inflater;
          private List&lt;Order&gt; orderList;
          private String[] bgColors;
  
          public SwipeListAdapter(Activity activity, List&lt;Order&gt; orderList) {
              this.activity = activity;
              this.orderList = orderList;
              bgColors = activity.getApplicationContext().getResources().getStringArray(R.array.movie_serial_bg);
          }
  
          @Override
          public int getCount() {
              return orderList.size();
          }
  
          @Override
          public Object getItem(int location) {
              return orderList.get(location);
          }
  
          @Override
          public long getItemId(int position) {
              return position;
          }
  
          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
  
              if (inflater == null)
                  inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              if (convertView == null)
                  convertView = inflater.inflate(R.layout.list_row, null);
  
              TextView serial = (TextView) convertView.findViewById(R.id.serial);
              TextView title = (TextView) convertView.findViewById(R.id.title);
  
              serial.setText(String.valueOf(orderList.get(position).id));
              title.setText(orderList.get(position).title);
  
              String color = bgColors[position % bgColors.length];
              serial.setBackgroundColor(Color.parseColor(color));
  
              return convertView;
          }
  
  }
  </code></pre>
  
  <p>PHP</p>
  
  <pre><code>&lt;?php
  header("refresh: 3;");
  
  $mysqli = new mysqli("irrelevant","irrelevant","irrelevant","irrelevant");
  
  /* check connection */
  if (mysqli_connect_errno()) {
      printf("Connect failed: %s\n", mysqli_connect_error());
      exit();
  }
  
  $query = "SELECT COUNT(*) FROM orders";
  $result = mysqli_query($mysqli,$query);
  $rows = mysqli_fetch_row($result);
  
  echo ($rows[0]);   
  
  $result-&gt;close();
  
  $mysqli-&gt;close();
  ?&gt;
  </code></pre>