You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Notes/src/GTaskASyncTask.java

217 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* @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通知管理器用于发送通知。
* mTaskManagerGTaskManager的实例用于管理任务。
* mOnCompleteListener任务完成的回调接口。
* @功能描述:通过在GTaskASyncTask类中声明这些成员变量和内部接口
* 可以在异步任务的执行过程中使用上下文、通知管理器和任务管理器等资源,
* 并在任务完成时回调通知调用者。这样可以更好地管理和控制异步任务的执行,并提供灵活的任务完成回调机制。
* @实现过程:
* @Author: wmq
*/
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {//执行的任务可以接收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();
}
}
}