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.
MiNotes/src新/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java

176 lines
7.6 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.

/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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;
/**
* @aPackage : net.micode.notes.gtask.remote
* @aClassName: GTaskASyncTask
* @Description:
* 异步操作类实现GTask的异步操作过程
* 主要方法:
* showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法
* doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间
* onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
* onPostExecute(Integer result) 相当于Handler 处理UI的方式在这里面可以使用在doInBackground 得到的结果处理操作UI
* @aAuthor: Li Qiushi
* @createdate: 12/24/2023 19:31 PM
*/
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
public interface OnCompleteListener {
void onComplete();
}
private Context mContext;
private NotificationManager mNotifiManager;
private GTaskManager mTaskManager;
private OnCompleteListener mOnCompleteListener;
public GTaskASyncTask(Context context, OnCompleteListener listener) {
mContext = context;
mOnCompleteListener = listener;
/*
获取系统服务中的NotificationManager对象并将其赋值给成员变量mNotifiManager。这个对象用于管理应用程序的通知
*/
mNotifiManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
mTaskManager = GTaskManager.getInstance();
}
public void cancelSync() {
mTaskManager.cancelSync();
}
public void publishProgess(String message) {//发布进度单位系统将会调用onProgressUpdate()方法更新这些值
publishProgress(new String[] {
message
});
}
/**
* 该函数用于向用户提示当前同步的状态,是一个用于交互的方法
* 两个参数一个整数类型的tickerId表示通知的唯一标识符
* 和一个字符串类型的content表示通知的内容可以是任何文本信息例如消息、警告或其他相关信息
*/
private void showNotification(int tickerId, String content) {
PendingIntent pendingIntent;//一个描述了想要启动一个Activity、Broadcast或是Service的意图
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);
}
/*
如果同步不成功那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象
如果同步成功那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象
*/
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();
//通过NotificationManager对象的notify方法来执行一个notification的消息
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
}
/**
*用于在后台线程中执行耗时操作具体来说,它的作用是在后台线程中同步数据
* 它是一个受保护的方法返回类型为Integer。该方法接受一个可变参数unused表示没有使用到的参数
*/
@Override
protected Integer doInBackground(Void... unused) {
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
.getSyncAccountName(mContext)));
/*
publishProgess用于更新进度信息NotesPreferenceActivity.getSyncAccountName(mContext)来生成进度信息
利用getString,把进程信息的内容传进sync_progress_login中
*/
return mTaskManager.sync(mContext, this);
/*
进行后台同步具体操作
sync方法接受两个参数一个是上下文对象mContext另一个是当前对象this
*/
}
@Override
protected void onProgressUpdate(String... progress) {
showNotification(R.string.ticker_syncing, progress[0]);
if (mContext instanceof GTaskSyncService) {
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
}
}
/**
* 用于在执行完后台任务后更新UI,显示结果
* 根据不同的执行结果代码会调用showNotification方法来显示相应的通知信息
* 显示的不同结果:
* 如果结果为GTaskManager.STATE_SUCCESS则显示成功同步的通知
* 如果结果为GTaskManager.STATE_NETWORK_ERROR则显示网络错误的通知
* 如果结果为GTaskManager.STATE_INTERNAL_ERROR则显示内部错误的通知
* 如果结果为GTaskManager.STATE_SYNC_CANCELLED则显示同步取消的通知
*/
@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));
}
/*
如果存在mOnCompleteListener对象代码还会创建一个新的线程来执行mOnCompleteListener.onComplete()方法,以完成一次操作
*/
if (mOnCompleteListener != null) {
new Thread(new Runnable() {
public void run() {
mOnCompleteListener.onComplete();
}
}).start();
}
}
}