开源中国源码学习(三)——Log日志上传

AppStart中开启了一个服务LogUploadService用来上传应用程序的日志。

采用的是start的方式开启服务,代码如下:

Intent uploadLog = new Intent(this, LogUploadService.class);
startService(uploadLog);

一、功能介绍:

在服务LogUploadService被开启后,根据情况进行如下几种操作:

  1. 读取osc本地文件夹下的日志信息
  2. 如果日志信息为空,服务停止—— LogUploadService.this.stopSelf()
  3. 如果日志信息不位空,上传日志;

二、详细介绍

停止服务

在该服务操作中,无论什么情况下都需要停止服务的(日志信息为空、日志上传成功、日志上传失败),停止服务时,使用如下代码:

LogUploadService.this.stopSelf()

关于stopSelf,在Google官方文档中如下描述:

If a component starts the service by calling startService() (which results in a call to onStartCommand()), then the service remains running until it stops itself with stopSelf() or another component stops it by calling stopService().

如果一个组件开启通过startService()开启了服务(其实是调用onStartCommand())方法,接着这个Service一直在运行知道它调用stopSelf()停止了自己或者另一个组件通过调用stopService方法停止该服务。

onStartCommand()

The system calls this method when another component, such as an activity, requests that the service be started, by calling startService(). Once this method executes, the service is started and can run in the background indefinitely. If you implement this, it is your responsibility to stop the service when its work is done, by calling stopSelf() or stopService(). (If you only want to provide binding, you don’t need to implement this method.)

当某一个组件比如Activity,通过调用startService()方法来开启一个服务时,系统会调用onStartCommand()方法。一旦这个方法执行之后,服务就会被开启并在后台独立的运行。如果你实现了这个方法,你必须在任务完成后通过调用stopSelf()或者stopService()来停止该服务。(如果你仅仅只想提供绑定,你不需要实现这个方法)

上传日志

日志上传的动作,封装在了OSChinaApi中,借助android-async-http完成该操作,代码如下

“`

OSChinaApi.uploadLog(data, new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {

//上传成功,删除本地记录的日志,并且,停止服务

log.delete();

LogUploadService.this.stopSelf();

}

            @Override
            public void onFailure(int arg0, Header[] arg1, byte[] arg2,
                    Throwable arg3) {
                //上传失败停止服务
                LogUploadService.this.stopSelf();
            }
        });

“`

这块的封装是非常巧妙的,在OSChinaApi中,进行了如下封装:

上传分为:上传日志uploadLog和上传反馈意见feedback,根据report来进行区分上传的类别

“`

private static void uploadLog(String data, String report,

AsyncHttpResponseHandler handler) {

RequestParams params = new RequestParams();

params.put(“app”, “1”);

params.put(“report”, report);

params.put(“msg”, data);

ApiHttpClient.post(“action/api/user_report_to_admin”, params, handler);

}

/**

* BUG上报

*

* @param data

* @param handler

*/

public static void uploadLog(String data, AsyncHttpResponseHandler handler) {

uploadLog(data, “1”, handler);

}

/**
 * 反馈意见
 *
 * @param data
 * @param handler
 */
public static void feedback(String data, AsyncHttpResponseHandler handler) {
    uploadLog(data, "2", handler);
}

“`

三、总结收获

  1. start 方式开启服务,调用onStartCommand方法,并且在任务结束后要 stop 服务——stopSelf或者stopService
  2. 上传日志和反馈意见的代码封装 OSChinaApi.java
  3. android-async-http 的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 12:55:46

开源中国源码学习(三)——Log日志上传的相关文章

开源中国源码学习(六)——ButterKnife的使用

本文翻译自 Butter Knife官方网站: ButterKnife 简介 用@Bind给字段进行注释并且Butter Knife会根据给定的View ID去查找并自动转换为与你的layout中相匹配的View. Activity Binding Activity绑定示例代码如下: class ExampleActivity extends Activity { @Bind(R.id.title) TextView title; @Bind(R.id.subtitle) TextView su

开源中国源码学习(一)——简介

前段时间学习了git-osc客户端的源码,感觉收获不少.尽管,代码并未完全吃透,但是,还是尝到了学习源码的甜头. git-osc客户端源码的第一期学习,暂告一段落. git-osc 客户端源码 git-osc源码学习笔记 从今天开始,开启oschina-app 客户端源码第一期的学习. 这期学习应该注意的事项: 所有的学习总结均用 MarkDown 进行编辑(在git-osc第一期学习总结时,是用.pages编辑后,导出为PDF文件,很不方便,阅读起来也很费劲) 每一篇的学习总结,按照如下格式:

开源中国源码学习(二)——Splash界面

今天主要学习开源中国应用启动时的Splash界面 功能介绍: 在应用启动的时候,出现一个启动的欢迎界面,在这个界面中完成的任务: Log日志的上传: 跳转到主页面 动画--在动画结束的时候进行上述两项操作 集成指南: 在自己开发应用的时候,Splash界面可以用来完成一些初始化工作,比如: 日志信息的上传: 资源的初始化(自己用过的经历--在Splash动画跳转的时候,将Assets文件夹中的内容拷贝到SD卡) 详细介绍 AppStart.java -- 整个应用的入口 LogUploadSer

开源中国源码学习(五)——切换皮肤(日间模式和夜间模式)

在开源中国客户端源码的侧滑菜单栏里有一个模式切换的选项,可以完成夜间模式和日间模式的相互转换. 一.功能介绍 在侧滑菜单栏里点击日间或者夜间后,客户端的皮肤可以发生变化,来达到保护眼睛的作用. 二.详细介绍 这是在MainActivity的onCreate方法中的一段代码,这段代码完成了读取本地配置中存储的日间模式和夜间模式信息,从而回显到客户端中. 读取本地配置信息,在应用启动时,回显至客户端 @Override protected void onCreate(Bundle savedInst

开源中国源码学习(四)——主界面总体认识

在AppStart中,我们看到在启动动画结束的时候,程序进行了一次redirectTo.完成了如下任务: Intent to LogUploadService Intent to MainActivity 这篇文章主要学习第二个任务:Intent to MainActivity. Intent intent = new Intent(this, MainActivity.class); startActivity(intent); 涉及到的知识点 夜间模式和日间模式的切换 ButterKnife

[Android]开源中国源码分析之一

开源中国android端版本号:2.4 启动界面: 在AndroidManifest.xml中找到程序的入口, <activity android:name=".AppStart" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@style/Theme.AppStartLoad" > <

[spring源码学习]三、IOC源码——自定义配置文件读取

一.环境准备 在文件读取的时候,第9步我们发现spring会根据标签的namespace来选择读取方式,联想spring里提供的各种标签,比如<aop:xxx>等应该会有不同的读取和解析方式,这一章我们来找一个其他文件,了解下spring自定义标签和配置的读取流程. 手边正好有一套dubbo的源码,因此为了区别与spring的原生读取,就使用它来进行分析. 首先spring的配置文件中我们需要加上标签的namespace <?xml version="1.0" enc

Bottle 框架源码学习 三

def run(app=None, server='wsgiref', host='127.0.0.1', port=8080,         interval=1, reloader=False, quiet=False, plugins=None,         debug=None, **kargs): 今天要学习一下bottle里是怎样打印debug信息的 run函数的倒数第二个参数是debug,默认为None try:     if debug is not None: _debu

Nmap 源码学习三 nmap_main主程序分析

主体程序位置在nmap.cc line:1640 学习要点: 程序在1650行,新建一个主机的单例对象, #ifndef NOLUA /* Only NSE scripts can add targets */ NewTargets *new_targets = NULL; /* Pre-Scan and Post-Scan script results datastructure */ ScriptResults *script_scan_results = NULL; #endif 从168