diff --git a/src/GTaskASyncTask.java b/src/GTaskASyncTask.java new file mode 100644 index 0000000..ca596c2 --- /dev/null +++ b/src/GTaskASyncTask.java @@ -0,0 +1,216 @@ +/** + * @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(); + } + } +}