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.
5._Open-source-software-rea.../src/gtask/remote/GTaskASyncTask.java

153 lines
6.4 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.

/*
* GTaskASyncTask 类说明:
* 这是一个继承自AsyncTask的类用于在后台执行Google任务同步操作。
* 它可以在一个独立的线程中执行同步任务,并通过通知栏通知用户同步的状态(成功、失败、取消等)。
* 同时,它提供了接口供调用者监听同步任务的完成。
*/
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 类负责执行 Google 任务的同步操作。
* 它是一个 AsyncTask它在后台线程中处理同步任务并更新UI。
*/
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
// 同步通知的唯一ID
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
// 定义完成监听器接口
public interface OnCompleteListener {
void onComplete(); // 同步完成时调用的方法
}
private Context mContext; // 上下文对象,用于访问应用资源和通知管理器
private NotificationManager mNotifiManager; // 通知管理器,用于管理和显示通知
private GTaskManager mTaskManager; // Google任务管理器用于执行实际的同步操作
private OnCompleteListener mOnCompleteListener; // 同步完成的监听器
/*
* 构造函数
* @param context 应用的上下文环境
* @param listener 同步完成时的监听器
*/
public GTaskASyncTask(Context context, OnCompleteListener listener) {
mContext = context; // 保存上下文
mOnCompleteListener = listener; // 设置监听器
mNotifiManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE); // 获取通知管理器
mTaskManager = GTaskManager.getInstance(); // 获取 Google 任务管理器实例
}
// 取消同步操作的方法
public void cancelSync() {
mTaskManager.cancelSync(); // 调用 Google 任务管理器的取消同步方法
}
// 发布进度更新的方法
public void publishProgess(String message) {
publishProgress(new String[]{ message }); // 调用AsyncTask的publishProgress方法
}
/*
* 显示通知的方法
* @param tickerId 通知的Ticker文本资源ID
* @param content 通知的内容文本
*/
private void showNotification(int tickerId, String content) {
PendingIntent pendingIntent;
// 根据不同的通知状态设置不同的Intent
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) // 通知内容
.setContentIntent(pendingIntent) // 点击按钮处理
.setWhen(System.currentTimeMillis()) // 通知时间
.setOngoing(true); // 设定为进行中的通知
Notification notification = builder.getNotification(); // 构建通知对象
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); // 显示通知
}
/*
* 在后台执行同步操作的方法
* @return 同步操作的状态码
*/
@Override
protected Integer doInBackground(Void... unused) {
// 开始同步时的进度更新
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
.getSyncAccountName(mContext))); // 发布同步中的消息
return mTaskManager.sync(mContext, this); // 执行同步操作,并返回状态码
}
/*
* 更新进度的方法会在调用publishProgress后被调用
* @param progress 进度更新的内容
*/
@Override
protected void onProgressUpdate(String... progress) {
// 显示当前同步进度
showNotification(R.string.ticker_syncing, progress[0]); // 显示同步进度的通知
// 如果上下文是一个GTaskSyncService实例发送广播更新进度
if (mContext instanceof GTaskSyncService) {
((GTaskSyncService) mContext).sendBroadcast(progress[0]); // 发送进度广播
}
}
/*
* 同步任务完成后的处理方法
* @param result 同步操作的状态码
*/
@Override
protected void onPostExecute(Integer result) {
// 根据不同的状态显示不同的通知
if (result == GTaskManager.STATE_SUCCESS) {
// 成功同步
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) {
// 内部错误
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));
}
// 如果设置了完成监听器则在一个新线程中调用其onComplete方法
if (mOnCompleteListener != null) {
new Thread(new Runnable() {
public void run() {
mOnCompleteListener.onComplete(); // 调用监听器的完成方法
}
}).start();
}
}
}