0

如何在遠程數據庫的每個更新中向用戶發送通知。我想通知用戶,如果有任何新行添加或更新現有的行。我正在使用自定義ListView並想顯示BigPictureStyle通知。在Android上獲取MYSQL更新通知

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))。它將僅返回新行,然後顯示通知。

但我的問題是它顯示來自遠程數據庫的新數據之前的通知。可能是因爲我正在從服務器上下載圖片。那麼,如何解決這個問題呢?

回答

0

因此,經過大量的研究,我已經解決了這個問題。我將所有代碼下載到doInBackground()中的數據,然後將結果傳遞給onPostExecute,並將其顯示在Notification上。