在Android上获取MYSQL更新通知



如何在远程数据库的每次更新时向用户发送通知。我想通知用户,如果有任何新的行添加或更新现有的一个。我正在使用自定义ListView并想要显示BigPictureStyle通知。

public class EventServices extends Service {
int numMessages = 0;
String rowCount = null;
int oldRowCount = 0;
HashMap<String,String> hashMap = new HashMap<>();
String rowCountLink = "http://192.168.0.101/getdbrowcount.php";
public EventServices() {
}
@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
    Toast.makeText(this, "Service was Created", Toast.LENGTH_LONG).show();
    oldRowCount = Integer.parseInt(getRowCount());
}

@Override
public void onStart(Intent intent, int startId) {
    Log.d("Parse","Old row count: "+ oldRowCount);
    Log.d("Parse","New row count: "+Integer.parseInt(getRowCount()));

    if(Integer.parseInt(getRowCount())> oldRowCount) {

        String newEventLink =  "http://192.168.0.101/getnewevent.php";
        new MyTask(newEventLink).execute();
        //  NewEventDetails newED = new NewEventDetails();
        // NewEventHashMap newEventHashMap = new NewEventHashMap();

        String name = hashMap.get("name");
        String description = hashMap.get("description");
        String image = hashMap.get("image");
        Log.d("Parse","New event name: "+name);
        Log.d("Parse","New event description: "+description);
        Log.d("Parse","New event image: "+image);

        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        Intent resultIntent = new Intent(this, ItemDetailActivity.class);
         resultIntent.putExtra("description",description);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0,
        resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder mNotifyBuilder;
        NotificationManager mNotificationManager;
        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        // Sets an ID for the notification, so it can be updated
        int notifyID = 9001;
        mNotifyBuilder = new NotificationCompat.Builder(this)
                .setContentTitle(name)
                .setContentText(description)
                .setSmallIcon(R.drawable.icon);
        // Set pending intent

    //    startActivity(resultIntent);
      //  mNotifyBuilder.setContentIntent()
        mNotifyBuilder.setContentIntent(resultPendingIntent);
        // Set Vibrate, Sound and Light
        int defaults = 0;
        defaults = defaults | Notification.DEFAULT_LIGHTS;
        defaults = defaults | Notification.DEFAULT_VIBRATE;
        defaults = defaults | Notification.DEFAULT_SOUND;
        mNotifyBuilder.setDefaults(defaults);
        // Set the content for Notification
        //  mNotifyBuilder.setContentText(intent.getStringExtra("intntdata"));
        // Set autocancel
        mNotifyBuilder.setAutoCancel(true);
        // Post a notification
        mNotificationManager.notify(notifyID, mNotifyBuilder.build());
        oldRowCount++;
    }else{
    }
}
@Override
public void onDestroy() {
    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}

private String getRowCount(){
    RowCountDownloader rowCountDownloader = new RowCountDownloader(rowCountLink);
    try {
        rowCount   = rowCountDownloader.execute().get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
  //  Log.d("Parse","Rowcount in services: "+rowCount);
    return  rowCount;
}

class MyTask extends AsyncTask<Void,Integer,String> {
    String newEventLink;
   // HashMap<String,String> hashMap = new HashMap<>();


    public MyTask( String newEventLink){
        this.newEventLink = newEventLink;
    }
    @Override
    protected String doInBackground(Void... params) {
        String data = downloadData();
        return  data;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {

    }
    private String downloadData() {
        String line = null;
        InputStream inputStream =null;
        try{
            URL url = new URL(newEventLink);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            inputStream = new BufferedInputStream(con.getInputStream());
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer sb = new StringBuffer();
            if (br != null) {
                while ((line = br.readLine()) != null) {
                    sb.append(line + "n");
                }
            } else {
                return null;
            }
            try{
                JSONObject jo = new JSONObject(sb.toString());
                JSONArray ja = jo.getJSONArray("result");
                JSONObject obj = ja.getJSONObject(0);
                hashMap.put("name",obj.getString("name"));
                hashMap.put("description",obj.getString("description"));
                hashMap.put("image",obj.getString("image"));

           }catch (JSONException e){
                e.printStackTrace();
            }
            return null;
        }catch(MalformedURLException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(inputStream!=null){
                try{
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        return null;
      }
    }


  }

每当一个新的服务被创建,它获取总行数(COUNT(*)从表),然后存储在变量中,然后下一次服务检查更新的行数从php脚本,然后比较它与现有的行数。如果新的行数大于现有的行数,那么它将从数据库中获取数据(SELECT * from table where id = (SELECT count (*) from table)))。它将只返回新行,然后显示通知。

但我的问题是它显示通知之前,它从远程数据库的新数据。可能是因为我正在从服务器下载图像。那么,如何解决这个问题呢?

所以,经过大量的研究,我解决了这个问题。我把所有的代码下载的数据在doInBackground(),然后在onPostExecute传递的结果,我已经显示在通知。

相关内容

  • 没有找到相关文章

最新更新