/** * @ProiectName:MiNote * @Package: gtask.remote * @ClassName: GTaskASyncTask * @Description:GTaskASyncTask类是一个异步任务类,用于执行后台任务并在UI线程更新相关的UI组件。 * 其功能包括1.后台任务的执行:例如从服务器获取数据、执行文件读写操作等。这些任务将在后台线程中执行,避免在UI线程中执行耗时操作而阻塞UI响应。 * 2.进度更新和反馈:在任务执行过程中,GTaskASyncTask类可以通过调用publishProgress()方法更新任务的进度, * 并且在UI线程中回调onProgressUpdate()方法,以便更新相关的UI组件 * 3.结果返回和处理:当任务执行完成后,GTaskASyncTask类会将执行结果返回给UI线程,并在UI线程中回调onPostExecute()方法。 * 在该方法中,可以根据任务执行结果更新UI组件、执行其他操作或显示提示信息。 * @Author: wmq */ package net.micode.notes.gtask.remote; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import net.micode.notes.R; import net.micode.notes.ui.NotesListActivity; import net.micode.notes.ui.NotesPreferenceActivity; /** * @功能名: 定义名为GTaskASyncTask的类,并声明了一些成员变量和内部接口 * @参数 : * mContext:上下文对象,用于获取系统服务。 * mNotifiManager:通知管理器,用于发送通知。 * mTaskManager:GTaskManager的实例,用于管理任务。 * mOnCompleteListener:任务完成的回调接口。 * @功能描述:通过在GTaskASyncTask类中声明这些成员变量和内部接口, * 可以在异步任务的执行过程中使用上下文、通知管理器和任务管理器等资源, * 并在任务完成时回调通知调用者。这样可以更好地管理和控制异步任务的执行,并提供灵活的任务完成回调机制。 * @实现过程: * @Author: wmq */ public class GTaskASyncTask extends AsyncTask {//执行的任务可以接收Void类型的输入参数,发布String类型的进度信息,最终返回Integer类型的结果。 private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;//静态变量,用于标识通知的ID。通常用于发送通知时唯一标识通知的标识符。 public interface OnCompleteListener {//内部接口,定义了一个回调方法onComplete()。当任务完成时,可以通过实现该接口,在任务完成时进行回调通知。 void onComplete(); } private Context mContext; private NotificationManager mNotifiManager; private GTaskManager mTaskManager; private OnCompleteListener mOnCompleteListener; /** * @功能名: GTaskASyncTask * @参数 : context/listener * @功能描述: 是本类的构造函数,)接收一个上下文对象作为参数,并在构造函数内部进行了一些初始化操作 * @实现过程: 见每一行后面 * @Author: wmq */ public GTaskASyncTask(Context context, OnCompleteListener listener) { mContext = context; //将传入的OnCompleteListener接口的实例赋值给成员变量mOnCompleteListener。用于在任务完成时回调通知调用者。 mOnCompleteListener = listener; mNotifiManager = (NotificationManager) mContext .getSystemService(Context.NOTIFICATION_SERVICE);//通过上下文对象获取通知管理器的实例。该通知管理器用于发送通知。 mTaskManager = GTaskManager.getInstance();//:通过调用GTaskManager类的静态方法getInstance()获取GTaskManager的单例实例。mTaskManager用于管理任务的执行。 } /** * @功能名: cancelSync() * @参数 : * @功能描述: 取消正在进行的同步任务 * @实现过程: 通过调用mTaskManager的cancelSync()方法来取消同步任务 * 某些情况下,用户需要停止或取消当前正在执行的任务,例如用户手动取消了同步操作或者发生了异常情况需要终止任务 * @Author: wmq */ public void cancelSync() { mTaskManager.cancelSync(); } /** * @功能名: publishProgess * @参数 :message * @功能描述: 用于发布任务执行的进度信息,在异步任务的执行过程中,有时需要将一些进度信息反馈给用户, * 可以通过调用publishProgress()方法来实现。该方法会在UI线程调用onProgressUpdate()方法,从而更 * 新UI界面上的进度信息。 * @实现过程: publishProgess方法重载了AsyncTask类中的publishProgress()方法, * 并将传入的message作为进度信息进行发布。这样,外部调用者就可以通过调用GTaskASyncTask * 对象的publishProgess()方法来发布任务的执行进度信息,从而实现任务进度的实时反馈。 * @Author: wmq */ public void publishProgess(String message) {// 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 publishProgress(new String[] { message }); } /* private void showNotification(int tickerId, String content) { Notification notification = new Notification(R.drawable.notification, mContext .getString(tickerId), System.currentTimeMillis()); notification.defaults = Notification.DEFAULT_LIGHTS; notification.flags = Notification.FLAG_AUTO_CANCEL; PendingIntent pendingIntent; if (tickerId != R.string.ticker_success) { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, NotesPreferenceActivity.class), 0); } else { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, NotesListActivity.class), 0); } //notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, // pendingIntent); notification.contentIntent = pendingIntent; mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); }*/ /** * @功能名: showNotification * @参数 :int tickerId / String content * @功能描述: * 根据传入的tickerId参数判断通知的类型: * 使用Notification.Builder类来构建通知: * 通过调用builder.getNotification()方法获取构建的通知对象; * 最后使用mNotifiManager.notify()方法发送通知 * @实现过程: 如果tickerId不等于R.string.ticker_success(即不是成功的通知),则创建一个将跳转到 * NotesPreferenceActivity类的PendingIntent对象。如果tickerId等于R.string.ticker_success * (即成功的通知),则创建一个将跳转到NotesListActivity类的PendingIntent对象。 * @Author: wmq */ private void showNotification(int tickerId, String content) { PendingIntent pendingIntent; if (tickerId != R.string.ticker_success) { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, NotesPreferenceActivity.class), 0); } else { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, NotesListActivity.class), 0); } Notification.Builder builder = new Notification.Builder(mContext) .setAutoCancel(true) //设置通知点击后自动取消 .setContentTitle(mContext.getString(R.string.app_name))//设置通知的标题为应用名称。 .setContentText(content)//设置通知的内容为传入的content参数。 .setContentIntent(pendingIntent)//设置通知点击时的跳转意图为之前创建的PendingIntent对象。 .setWhen(System.currentTimeMillis())//时间设置 .setOngoing(true);//用户无法手动清除 Notification notification=builder.getNotification(); mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//将通知显示在系统通知栏中。其中GTASK_SYNC_NOTIFICATION_ID作为通知的ID,可以用于标识该通知。 } /** * @功能名: doInBackground * @参数 : unused * @功能描述: 用于在后台执行耗时操作,如网络请求、数据库查询等任务。 * @实现过程: @Override注解表示该方法是对父类(AsyncTask)中的方法进行重写 *在执行过程中可以调用publishProgress()方法来更新异步任务的执行进度。 *最后返回同步操作的结果,通常是一个代表同步状态的整数值。 * @Author: wmq */ @Override protected void onProgressUpdate(String... progress) { showNotification(R.string.ticker_syncing, progress[0]); if (mContext instanceof GTaskSyncService) { ((GTaskSyncService) mContext).sendBroadcast(progress[0]); } } /** * @功能名: onPostExecute * @参数 : result * @功能描述: 用于在后台操作完成后执行一些操作,通常是更新UI界面或者执行回调函数。 * @实现过程: 利用result进行不同状态的判断,并执行相应的方法,具体在下面标注 * @Author: wmq */ @Override //表示该方法是对父类(AsyncTask)中的方法进行重写 protected void onPostExecute(Integer result) { //这表示该方法接收一个Integer类型的参数result,表示后台操作的结果。 if (result == GTaskManager.STATE_SUCCESS) { //表示同步操作成功,那么会显示一个通知,更新上次同步时间,并执行NotesPreferenceActivity.setLastSyncTime()方法保存最新的同步时间。 showNotification(R.string.ticker_success, mContext.getString( R.string.success_sync_account, mTaskManager.getSyncAccount())); NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); } else if (result == GTaskManager.STATE_NETWORK_ERROR) { //表示网络错误,会显示一个通知,提示同步时发生网络错误。 showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { //表示内部错误,会显示一个通知,提示同步时发生内部错误。如果result等于 showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { //表示同步被取消,会显示一个通知,提示同步被取消。 showNotification(R.string.ticker_cancel, mContext .getString(R.string.error_sync_cancelled)); } if (mOnCompleteListener != null) { //如果存在mOnCompleteListener回调函数对象,会在新的线程中执行mOnCompleteListener.onComplete()方法。 new Thread(new Runnable() { public void run() { mOnCompleteListener.onComplete(); } }).start(); } } }