網絡請求_Retrofit
- 首頁: https://github.com/square/retrofit
-
http://square.github.io/retrofit/
*
- 注意: 使用Retrofit的前提是伺服器端代碼遵循REST規範 !!!!!
- 功能:
- 效率非常高
- 可以直接将結果轉換稱Java類
- 主要是配合RxJava一起使用
- 配置:
- 添加Retrofit依賴: compile ‘com.squareup.retrofit2:retrofit:2.0.2’
- 添加資料解析依賴,根據實際情況進行選擇
- Gson : com.squareup.retrofit2:converter-gson:2.0.2
- Jackson : com.squareup.retrofit2:converter-jackson:2.0.2
- Moshi : com.squareup.retrofit2:converter-moshi:2.0.2
- Protobuf : com.squareup.retrofit2:converter-protobuf:2.0.2
- Wire : com.squareup.retrofit2:converter-wire:2.0.2
- Simple XML : com.squareup.retrofit2:converter-simplexml:2.0.2
- 使用步驟:
-
使用AndroidStudio gsonFormat插件建立資料模型
http://apis.juhe.cn/mobile/get?phone=13612345678&key=daf8fa858c330b22e342c882bcbac622
- 建立REST API 接口
- 常用注解:
- 請求方法:@GET / @POST / @PUT / @DELETE / @HEAD
- URL處理
- @Path - 替換參數
@GET("/group/{id}/users") public Call<List<User>> groupList(@Path("id") int groupId);
- @Query - 添加查詢參數
@GET("/group/{id}/users") public Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
- @QueryMap - 如果有多個查詢參數,把它們放在Map中
@GET("/group/{id}/users") public Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
- @Path - 替換參數
- 示例代碼:
public interface NetAPI { @GET("/users/{user}") public Call<GitModel> getFeed(@Path("user") String user); @GET("/service/getIpInfo.php") public Call<IPModel> getWeather(@Query("city")String city); }
- 常用注解:
- 建立Retrofit對象, 并發起請求.示例代碼:
// 建構Retrofit執行個體 Retrofit retrofit = new Retrofit.Builder(). baseUrl(API2). addConverterFactory(GsonConverterFactory.create()). build(); // 建構接口的實作類 IpAPI weatherAPI = retrofit.create(IpAPI.class); // 調用接口定義的方法 Call<IPModel> weatherCall = weatherAPI.getWeather("8.8.8.8"); // 異步執行請求 weatherCall.enqueue(new Callback<IPModel>() { @Override public void onResponse(Call<IPModel> call, Response<IPModel> response) { IPModel model = response.body(); System.out.println("country:" + model.getData().getCountry()); } @Override public void onFailure(Call<IPModel> call, Throwable t) { System.out.println(t.toString()); } });
-
- 優點:
圖像
3.1圖像_UIL
- 首頁: https://github.com/nostra13/Android-Universal-Image-Loader
- 使用步驟:
- 添加依賴: compile ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
- 添權重限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 在Application或Activity中進行初始化配置
// ImageLoaderConfiguration 詳細配置 File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "imageloader/Cache"); // 自定義緩存檔案夾 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // 指定緩存到記憶體時圖檔的大小,預設是螢幕尺寸的長寬 .diskCacheExtraOptions(480, 800, null) // 指定緩存到硬碟時圖檔的大小,并不建議使用 .taskExecutor(new Executor()) // 自定義一個線程來加載和顯示圖檔 .taskExecutorForCachedImages(new Executor())// 自定義一個線程來緩存圖檔 .threadPoolSize(3) // default, 指定線程池大小 .threadPriority(Thread.NORM_PRIORITY - 2) // default ,指定線程優先級 .tasksProcessingOrder(QueueProcessingType.FIFO) // default , 指定加載顯示圖檔的任務隊列的類型 .denyCacheImageMultipleSizesInMemory() // 禁止在記憶體中緩存同一張圖檔的多個尺寸類型 .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) // 指定記憶體緩存的大小,預設值為1/8 應用的最大可用記憶體 .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiskCache(cacheDir)) // default , 指定硬碟緩存的位址 .diskCacheSize(50 * 1024 * 1024) // 指定硬碟緩存的大小 .diskCacheFileCount(100) // 指定硬碟緩存的檔案個數 .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default , 指定硬碟緩存時檔案名的生成器 .imageDownloader(new BaseImageDownloader(context)) // default , 指定圖檔下載下傳器 .imageDecoder(new BaseImageDecoder()) // default , 指定圖檔解碼器 .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default , 指定圖檔顯示的配置 .writeDebugLogs() // 是否顯示Log .build(); // ImageLoaderConfiguration 簡單初始化 ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this); // 初始化配置 ImageLoader.getInstance().init(configuration);
- DisplayImageOptions 參數詳解:
DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) // 圖檔正在加載時顯示的圖檔資源ID .showImageForEmptyUri(R.drawable.ic_empty) // URI為空時顯示的圖檔資源ID .showImageOnFail(R.drawable.ic_error) // 圖檔加載失敗時顯示的圖檔資源ID .resetViewBeforeLoading(false) // default 圖檔在下載下傳前是否重置,複位 .delayBeforeLoading(1000) // 圖檔開始加載前的延時.預設是0 .cacheInMemory(false) // default , 是否緩存在記憶體中, 預設不緩存 .cacheOnDisk(false) // default , 是否緩存在硬碟 , 預設不緩存 .preProcessor(new BitmapProcessor) // 設定圖檔緩存在記憶體前的圖檔處理器 .postProcessor(new BitmapProcessor) // 設定圖檔在緩存到記憶體以後 , 顯示在界面之前的圖檔處理器 .extraForDownloader(...) // 為圖檔下載下傳設定輔助參數 .considerExifParams(false) // default , 設定是否考慮JPEG圖檔的EXIF參數資訊,預設不考慮 .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default , 指定圖檔縮放的方式,ListView/GridView/Gallery推薦使用此預設值 .bitmapConfig(Bitmap.Config.ARGB_8888) // default , 指定圖檔的品質,預設是 ARGB_8888 .decodingOptions(...) // 指定圖檔的解碼方式 .displayer(new SimpleBitmapDisplayer()) // default , 設定圖檔顯示的方式,用于自定義 .handler(new Handler()) // default ,設定圖檔顯示的方式和ImageLoadingListener的監聽, 用于自定義 .build();
- 顯示圖檔的方法:
ImageLoader.getInstance().loadImage(String uri, ImageLoadingListener listener) displayImage(String uri, ImageView imageView) displayImage(String uri, ImageView imageView, DisplayImageOptions options) displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)
- 特殊用法:
- 顯示圓形圖檔.使用該效果,必須顯式指定圖檔的寬高
DisplayImageOptions options = new DisplayImageOptions.Builder() .displayer(new CircleBitmapDisplayer()) .build();
- 顯示圓角圖檔.使用該效果,必須顯式指定圖檔的寬高
DisplayImageOptions options = new DisplayImageOptions.Builder() .displayer(new RoundedBitmapDisplayer(90)) .build();
- 顯示漸顯圖檔
DisplayImageOptions options = new DisplayImageOptions.Builder() .displayer(new FadeInBitmapDisplayer(3000)) .build();
- 顯示圓形圖檔.使用該效果,必須顯式指定圖檔的寬高
3.2圖像_Fresco
- 首頁: https://github.com/facebook/fresco
- 中文文檔: http://fresco-cn.org/docs/index.html
- 中文網站:http://www.fresco-cn.org/
- 使用步驟
- 添加依賴: compile ‘com.facebook.fresco:fresco:0.9.0+’
- 添權重限
<uses-permission android:name="android.permission.INTERNET"/>
- 在Application初始化或在Activity 的setContentView()方法之前,進行初始化
Fresco.initialize(this);
- 在布局檔案中添加圖檔控件.寬高必須顯示指定,否則圖檔無法顯示.
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="200dp" android:layout_height="200dp" fresco:placeholderImage="@mipmap/ic_launcher" />
- 在Java代碼中指定圖檔的路徑.顯示圖檔.SimpleDraweeView接收的路徑參數為URI,是以需要一次轉換.
Uri uri = Uri.parse(URL_IMG2); SimpleDraweeView view = (SimpleDraweeView) findViewById(R.id.my_image_view); view.setImageURI(uri);
- XML方式配置參數.除圖檔位址以外,其他所有顯示選項都可以在布局檔案中指定
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="20dp" android:layout_height="20dp" fresco:actualImageScaleType="focusCrop"// 圖檔的縮放方式. fresco:backgroundImage="@color/blue" //背景圖.不支援縮放.XML僅能指定一張背景圖.如果使用Java代碼指定的話,可以指定多個背景,顯示方式類似FrameLayout,多個背景圖按照順序一級一級層疊上去. fresco:fadeDuration="300" // 漸顯圖檔的時間 fresco:failureImage="@drawable/error" // 圖檔加載失敗顯示的圖檔 fresco:failureImageScaleType="centerInside" 圖檔加載失敗顯示的圖檔的縮放類型 fresco:overlayImage="@drawable/watermark" // 層疊圖,最後疊加在圖檔之上.不支援縮放.XML僅能指定一張.如果使用Java代碼指定的話,可以指定多個,顯示方式類似FrameLayout,多個圖按照順序一級一級層疊上去. fresco:placeholderImage="@color/wait_color" // 圖檔加載成功之前顯示的占位圖 fresco:placeholderImageScaleType="fitCenter" // 圖檔加載成功之前顯示的占位圖的縮放類型 fresco:pressedStateOverlayImage="@color/red" // 設定按壓狀态下的層疊圖.不支援縮放. fresco:progressBarAutoRotateInterval="1000" // 進度條圖檔旋轉顯示時長 fresco:progressBarImage="@drawable/progress_bar" // 進度條圖檔 fresco:progressBarImageScaleType="centerInside" //進度條圖檔的縮放類型 fresco:retryImage="@drawable/retrying" // 當圖檔加載失敗的時候,顯示該圖檔提示使用者點選重新加載圖檔 fresco:retryImageScaleType="centerCrop" // 提示圖檔的縮放類型 fresco:roundAsCircle="false" // 顯示圓形圖檔 fresco:roundBottomLeft="false" // roundedCornerRadius屬性設定後,四個角都會有圓角,如果左下角不需要設定為false. fresco:roundBottomRight="true" // roundedCornerRadius屬性設定後,四個角都會有圓角,如果右下角不需要設定為false. fresco:roundTopLeft="true" // roundedCornerRadius屬性設定後,四個角都會有圓角,如果左上角不需要設定為false. fresco:roundTopRight="false" // roundedCornerRadius屬性設定後,四個角都會有圓角,如果右上角不需要設定為false. fresco:roundWithOverlayColor="@color/corner_color" // 設定圖檔圓角後空出區域的顔色.如示例圖中的紅色部分 fresco:roundedCornerRadius="1dp" // 設定圖檔圓角角度,設定該屬性後四個角都會生效 fresco:roundingBorderColor="@color/border_color" // 設定圓角後,邊框的顔色. fresco:roundingBorderWidth="2dp" /> // 設定圓角後,外邊框的寬高
- Java代碼配置參數.
GenericDraweeHierarchy hierarchy = GenericDraweeHierarchyBuilder .newInstance(getResources()) .setRetryImage(getResources().getDrawable(R.mipmap.ic_launcher)) .build(); imageivew.setHierarchy(hierarchy);
- 顯示GIF圖檔.Fresco 支援 GIF 和 WebP 格式的動畫圖檔.如果你希望圖檔下載下傳完之後自動播放,同時,當View從螢幕移除時,停止播放,隻需要在 image request 中簡單設定,示例代碼:
DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(URL_GIF) .setAutoPlayAnimations(true) .build(); simpleDraweeView.setController(controller);
3.3圖像_Picasso
- 首頁: https://github.com/square/picasso
- 使用步驟
- 添加依賴 compile ‘com.squareup.picasso:picasso:2.5.2’
- 添權重限:
<uses-permission android:name="android.permission.INTERNET"/>
- 加載圖檔,示例代碼:
Picasso .with(this)// 指定Context .load(URL_IMG3) //指定圖檔URL .placeholder(R.mipmap.ic_launcher) //指定圖檔未加載成功前顯示的圖檔 .error(R.mipmap.ic_launcher)// 指定圖檔加載失敗顯示的圖檔 .resize(300, 300)// 指定圖檔的尺寸 .fit()// 指定圖檔縮放類型為fit .centerCrop()// 指定圖檔縮放類型為centerCrop .centerInside()// 指定圖檔縮放類型為centerInside .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)// 指定記憶體緩存政策 .priority(Picasso.Priority.HIGH)// 指定優先級 .into(imageView); // 指定顯示圖檔的ImageView
- 顯示圓形圖檔.示例代碼:
// 自定義Transformation Transformation transform = new Transformation() { @Override public Bitmap transform(Bitmap source) { int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); if (squaredBitmap != source) { source.recycle(); } Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig()); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); paint.setShader(shader); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); squaredBitmap.recycle(); return bitmap; } @Override public String key() { return "circle"; } }; Picasso .with(this)// 指定Context .load(URL_IMG2) //指定圖檔URL .transform(transform) // 指定圖檔轉換器 .into(imageView); // 指定顯示圖檔的ImageView
- 顯示圓角圖檔
class RoundedTransformation implements com.squareup.picasso.Transformation { private final int radius; private final int margin; // dp // radius is corner radii in dp // margin is the board in dp public RoundedTransformation(final int radius, final int margin) { this.radius = radius; this.margin = margin; } @Override public Bitmap transform(final Bitmap source) { final Paint paint = new Paint(); paint.setAntiAlias(true); paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); canvas.drawRoundRect(new RectF(margin, margin, source.getWidth() - margin, source.getHeight() - margin), radius, radius, paint); if (source != output) { source.recycle(); } return output; } @Override public String key() { return "rounded(radius=" + radius + ", margin=" + margin + ")"; } } Picasso .with(this)// 指定Context .load(URL_IMG2) //指定圖檔URL .transform(new RoundedTransformation(360,0)) // 指定圖檔轉換器 .into(imageView); // 指定顯示圖檔的ImageView
3.4圖像_Glide
- 首頁: https://github.com/bumptech/glide
- 中文文檔: http://mrfu.me/2016/02/27/Glide_Getting_Started/
- 使用步驟
- 添加依賴 compile ‘com.github.bumptech.glide:glide:3.7.0’ , 同時還依賴于supportV4.如果沒有請自行添加
- 添權重限:
<uses-permission android:name="android.permission.INTERNET"/>
- 加載圖檔.示例代碼:
Glide .with(this) // 指定Context .load(URL_GIF)// 指定圖檔的URL .placeholder(R.mipmap.ic_launcher)// 指定圖檔未成功加載前顯示的圖檔 .error(R.mipmap.ic_launcher)// 指定圖檔加載失敗顯示的圖檔 .override(300, 300)//指定圖檔的尺寸 .fitCenter()//指定圖檔縮放類型為fitCenter .centerCrop()// 指定圖檔縮放類型為centerCrop .skipMemoryCache(true)// 跳過記憶體緩存 .diskCacheStrategy(DiskCacheStrategy.NONE)//跳過磁盤緩存 .diskCacheStrategy(DiskCacheStrategy.SOURCE)//僅僅隻緩存原來的全分辨率的圖像 .diskCacheStrategy(DiskCacheStrategy.RESULT)//僅僅緩存最終的圖像 .diskCacheStrategy(DiskCacheStrategy.ALL)//緩存所有版本的圖像 .priority(Priority.HIGH)//指定優先級.Glide 将會用他們作為一個準則,并盡可能的處理這些請求,但是它不能保證所有的圖檔都會按照所要求的順序加載。優先級排序:IMMEDIATE > HIGH > NORMAL > LOW .into(imageView);//指定顯示圖檔的ImageView
- 顯示圓形圖檔
class GlideCircleTransform extends BitmapTransformation { public GlideCircleTransform(Context context) { super(context); } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool, toTransform); } private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; // TODO this could be acquired from the pool too Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); return result; } @Override public String getId() { return getClass().getName(); } } Glide .with(this) // 指定Context .load(URL_GIF)// 指定圖檔的URL .transform(new GlideCircleTransform(this)) // 指定自定義BitmapTransformation .into(imageView);//指定顯示圖檔的ImageView
- 顯示圓角圖檔
class GlideRoundTransform extends BitmapTransformation { private static float radius = 0f; public GlideRoundTransform(Context context) { this(context, 4); } public GlideRoundTransform(Context context, int dp) { super(context); this.radius = Resources.getSystem().getDisplayMetrics().density * dp; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); } private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } @Override public String getId() { return getClass().getName() + Math.round(radius); } } Glide .with(this) // 指定Context .load(URL_GIF)// 指定圖檔的URL .transform(new GlideRoundTransform(this,30)) // 指定自定義BitmapTransformation .into(imageView);//指定顯示圖檔的ImageView
圖像庫對比
- 快速加載圖檔推薦Glide
- 對圖檔品質要求較高推薦Picasso
- 如果應用加載的圖檔很多,推薦Fresco > Glide > Picasso
資料庫
4.1資料庫_ormlite (Object Relationship match對象關系映射)
- 首頁: http://ormlite.com/
- 配置: 添加以下依賴
- compile ‘com.j256.ormlite:ormlite-android:4.48’
- compile ‘com.j256.ormlite:ormlite-core:4.48’
- 用途: 操作資料庫
- 使用步驟
- 建立資料庫表結構的實體類.示例代碼:
@DatabaseTable(tableName = "user") public class User { @DatabaseField(generatedId = true) private int id; @DatabaseField(columnName = "name") private String name; @DatabaseField(columnName = "age") private int age; @DatabaseField(columnName = "tel") private String tel; public User() { } public User(String name, int age, String tel) { this.name = name; this.age = age; this.tel = tel; } }
- 建立OrmLiteSqliteOpenHelper的實作類.示例代碼:
public class UserDBOpenHelper extends OrmLiteSqliteOpenHelper { public UserDBOpenHelper(Context context) { super(context, "user.db", null, 1); } @Override public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { try { // 建立表 TableUtils.createTable(connectionSource, User.class); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) { try { // 更新表 TableUtils.dropTable(connectionSource, User.class, true); onCreate(database, connectionSource); } catch (SQLException e) { e.printStackTrace(); } } private static UserDBOpenHelper instance; public static synchronized UserDBOpenHelper getInstance(Context context) { if (instance == null) { synchronized (UserDBOpenHelper.class) { if (instance == null) { instance = new UserDBOpenHelper(context); } } } return instance; } private Dao<User, Integer> dao; // 擷取操作資料庫的DAO public Dao<User, Integer> getUserDao() throws SQLException { if (dao == null) { dao = getDao(User.class); } return dao; } @Override public void close() { super.close(); dao = null; } }
- 擷取資料庫的DAO對象, 即可進行增删改查的操作.示例代碼:
UserDBOpenHelper helper = new UserDBOpenHelper(this); Dao<User, Integer> dao = helper.getUserDao(); User user = new User("zhangsan", 12, "13212345678"); // 增 dao.create(user); // 改 dao.updateRaw("update user set tel = '18882348888' where name = ?", new String[]{"王武"}); // 查 List<User> query = dao.queryForEq("name", "王武"); // 删 dao.deleteById(2);
- 建立資料庫表結構的實體類.示例代碼:
4.2資料庫_greenDAO
- 首頁: https://github.com/greenrobot/greenDAO
- 配置: 添加以下依賴
- compile ‘de.greenrobot:greendao:2.1.0’
- compile ‘de.greenrobot:greendao-generator:2.1.0’
- 用途: 操作資料庫
- 優點:
- 性能最大化,記憶體開銷最小化
- 易于使用的API
- 為Android進行高度優化
- 使用步驟
- 建立自定義的DAOGenerater,指定資料庫相關配置并生成相關類
public class CustomDAOGenerater { public static void main(String[] args) throws Exception { // 第一個參數為資料庫版本 //第二個參數為資料庫的包名 Schema schema = new Schema(1, "com.alpha.db"); // 建立表,參數為表名 Entity entity = schema.addEntity("Info"); // 為表添加字段 entity.addIdProperty();// 該字段為id entity.addStringProperty("name");// String類型字段 entity.addIntProperty("age");//Int類型字段 entity.addStringProperty("tel");// String類型字段 // 生成資料庫相關類 //第二個參數指定生成檔案的本次存儲路徑,AndroidStudio工程指定到目前工程的java路徑 new DaoGenerator().generateAll(schema, "C:\\Users\\Alpha\\AndroidStudioProjects\\GreenDaoDemo\\app\\src\\main\\java"); } }
- 通過DaoMaster.DevOpenHelper初始化資料庫
// 使用單例,避免建立多個Session public class DBUtil { private static DBUtil instance; private static Context context; private static UserDao userDao; private static DepartmentDao departmentDao; private DBUtil(){ } public synchronized static DBUtil getInstance(Context context) { DBUtil.context = context; if (instance == null) { instance = new DBUtil(); DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper( context, "company.db", null); SQLiteDatabase db = openHelper.getWritableDatabase(); DaoMaster master = new DaoMaster(db); DaoSession session = master.newSession(); // 擷取資料操作的dao對象 userDao = session.getUserDao(); departmentDao = session.getDepartmentDao(); } return instance; } public UserDao getUserDao() { return userDao; } }
- 擷取資料庫的DAO對象,即可進行增删改查的操作
// 增 dao.insert(new Info(null, "zhangsan", 12, "13112345678")); // 删 dao.deleteByKey(1L); // 改 Info info = new Info(3L, "趙琦", 78, "18812348888"); dao.update(info); // 查 QueryBuilder<Info> builder = dao.queryBuilder(); builder.where(InfoDao.Properties.Name.eq("lisi")); Query<Info> build = builder.build(); List<Info> list = build.list();
- 建立自定義的DAOGenerater,指定資料庫相關配置并生成相關類
4.3資料庫_Litepal
- 首頁: https://github.com/LitePalFramework/LitePal
- 中文文檔位址: http://blog.csdn.net/sinyu890807/article/category/2522725
響應式函數程式設計Rx(Reactive Extensions)
5.1 響應式函數程式設計_RxJava & RxAndroid
- 首頁: https://github.com/ReactiveX/RxJava
- 中文資料:
- https://github.com/lzyzsd/Awesome-RxJava
- https://www.zhihu.com/question/35511144
- 用途:
- 異步操作
- 在程式邏輯異常複雜的情況下,仍然可以讓代碼的邏輯保持簡潔
- 配置: 添加依賴:
- compile ‘io.reactivex:rxjava:1.1.3’
- compile ‘io.reactivex:rxandroid:1.1.0’
- 如果結合Retrofit使用,需要添加以下依賴
- compile ‘com.squareup.retrofit2:retrofit:2.0.1’
- compile ‘com.squareup.retrofit2:converter-gson:2.0.1’
- compile ‘com.squareup.retrofit2:adapter-rxjava:2.0.1’
- 基本概念:
- 被觀察者: Observable
- 作用: 決定什麼時候觸發事件以及觸發怎樣的事件
- 建立方法:
- Observable.just(T…) 參數為單個的
- Observable.from(T[]) / Observable.from(Iterable
- 被觀察者: Observable
第三方分享
6.1第三方分享_Mob
- 首頁: http://www.mob.com/
- 用途:第三方分享
- 使用步驟
- 通路http://dashboard.mob.com/#/share/index注冊應用擷取AppKey
- 通路http://www.mob.com/#/downloadDetail/ShareSDK/android下載下傳SDK
- 解壓下載下傳回來的SDK,打開ShareSDK for Android中的QuickIntegrater.jar,填入應用的名稱和包名,讓工具生成相關的資源檔案.并拷貝到工程當中
- 配置權限
<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <!-- 藍牙分享所需的權限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- 添加Activity資訊
<activity android:name="com.mob.tools.MobUIShell" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden|adjustResize" > <intent-filter> <!-- tencent後面的appid要保持和您配置的QQ的appid一緻 --> <data android:scheme="tencent100371282" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <!-- 調用新浪原生SDK,需要注冊的回調activity --> <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
- 如果您內建了微信,易信,新浪微網誌支付寶還需要添加下面回調的activity處理
<!--微信分享回調 --> <activity android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" /> <!--易信分享回調 --> <activity android:name=".yxapi.YXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" /> <!-- 支付寶分享回調 --> <activity android:name=".apshare.ShareEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true"/>
- 更改assets/ShareSDK中的配置資訊.根據自己的實際情況更改每一個平台的資訊
- 分享.示例代碼:
private void showShare() { ShareSDK.initSDK(this); OnekeyShare oks = new OnekeyShare(); //關閉sso授權 oks.disableSSOWhenAuthorize(); // 分享時Notification的圖示和文字 2.5.9以後的版本不調用此方法 //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name)); // title标題,印象筆記、郵箱、資訊、微信、人人網和QQ空間使用 oks.setTitle(getString(R.string.share)); // titleUrl是标題的網絡連結,僅在人人網和QQ空間使用 oks.setTitleUrl("http://sharesdk.cn"); // text是分享文本,所有平台都需要這個字段 oks.setText("我是分享文本"); // imagePath是圖檔的本地路徑,Linked-In以外的平台都支援此參數 //oks.setImagePath("/sdcard/test.jpg");//確定SDcard下面存在此張圖檔 // url僅在微信(包括好友和朋友圈)中使用 oks.setUrl("http://sharesdk.cn"); // comment是我對這條分享的評論,僅在人人網和QQ空間使用 oks.setComment("我是測試評論文本"); // site是分享此内容的網站名稱,僅在QQ空間使用 oks.setSite(getString(R.string.app_name)); // siteUrl是分享此内容的網站位址,僅在QQ空間使用 oks.setSiteUrl("http://sharesdk.cn"); // 啟動分享GUI oks.show(this); }
6.2第三方分享_友盟
- 首頁: http://www.umeng.com/social
資料統計
7.1資料統計_百度統計
- 首頁: http://mtj.baidu.com/web/sdk/index
- 開發文檔: http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%99%BE%E5%BA%A6%E7%A7%BB%E5%8A%A8%E7%BB%9F%E8%AE%A1API/%E7%99%BE%E5%BA%A6%E7%A7%BB%E5%8A%A8%E7%BB%9F%E8%AE%A1_Android%E7%89%88SDK
- 配置: 将下載下傳回來的jar放在libs目錄.并添加到依賴中
- 用途:
- 分析流量來源: 管道流量對比、細分管道分析,準确監控不同推廣位資料,實時獲知管道貢獻。
- 分析使用者:基于百度的海量資料積累,多元度分析并呈現使用者畫像資訊。
- 分析終端:裝置分布一目了然(裝置型号、品牌、作業系統、分辨率、聯網方式、營運商等)。
- 使用步驟
- 登入http://mtj.baidu.com/web/dashboard注冊應用并擷取appkey
- 在manifest檔案中添權重限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <!--(藍牙為手表統計必填)--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!--(3.7.1 新增)--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!--可選的權限--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- 在manifest檔案的application節點添加相應的參數.根據實際業務需求選擇
<!--您從百度網站擷取的 APP KEY--> <meta-data android:name="BaiduMobAd_STAT_ID" android:value="08fbd2c8ce" /> <!--管道商編号,根據實際情況自行填寫--> <meta-data android:name="BaiduMobAd_CHANNEL" android:value="Baidu Market" /> <!--是否開啟錯誤日志統計,預設為 false--> <meta-data android:name="BaiduMobAd_EXCEPTION_LOG" android:value="false" /> <!--日志發送政策, 可選值: APP_START、 ONCE_A_DAY、 SET_TIME_INTERVAL, 預設為 APP_START--> <meta-data android:name="BaiduMobAd_SEND_STRATEGY" android:value="APP_START" /> <!--日志發送政策 為 SET_TIME_INTERVAL 時,需設定時間間隔.取值為 1-‐24 的整數,預設為 1,機關為小時--> <meta-data android:name="BaiduMobAd_TIME_INTERVAL" android:value="1" /> <!--日志僅在 wifi 網絡下發送,預設為 false--> <meta-data android:name="BaiduMobAd_ONLY_WIFI" android:value="false" /> <!--是否擷取基站位置資訊 ,預設為 true--> <meta-data android:name="BaiduMobAd_CELL_LOCATION" android:value="true" /> <!--是否擷取 GPS 位置資訊,預設為 true--> <meta-data android:name="BaiduMobAd_GPS_LOCATION" android:value="true" /> <!--是否擷取 WIFI 位置資訊,預設為 true--> <meta-data android:name="BaiduMobAd_WIFI_LOCATION" android:value="true" />
- 在所有的Activity的onResume()和onPause()方法中調用StatService.onResume(Context context) 和StatService.onPause (Context context)方法.是以最好建立一個BaseActiviy,并在其中實作這兩個方法.出入的參數必須為this,不能是全局的Application Context.
- Fragment也是同理.在onResume()和onPause()方法中調用StatService.onResume(Context context) 和StatService.onPause (Context context)方法
消息推送
8.1消息推送
- 個推: http://www.getui.com/
- 友盟: http://www.umeng.com/push
- 百度雲推送: http://push.baidu.com/fc
- 極光推送: https://www.jiguang.cn/push
個推
- 首頁: http://www.getui.com/
- 開發文檔: http://docs.getui.com/pages/viewpage.action?pageId=589890
- 使用步驟:
- 通路https://dev.getui.com/dos4.0/index.html#login注冊應用
- 下載下傳SDK并解壓:http://docs.getui.com/mobile/android/overview/
- 将SDK解壓後的資源檔案中的GetuiSDK2.9.0.0.jar拷貝到項目中的libs,并添加到依賴
- 因為Android Studio工程預設已經添加了supportV7的依賴,如果沒有,請添加supportV4的依賴,否則會有異常
- 在\app\src\main目錄中建立檔案夾jniLibs(名字固定),然後把對應的so檔案添加進去
- 将SDK解壓後的資源檔案中的layout檔案拷貝到項目的layout檔案夾
- 為了修改通知欄提示圖示,請在res/drawable-hdpi/、res/drawable-mdpi/、res/drawable-ldpi/等各分辨率資源目錄下,放置相應尺寸的push.png圖檔。可将SDK解壓後的Demo工程中的push圖檔拷貝進來
- 添權重限. 注意替換包名
<!-- 解決Android L上通知顯示異常問題,targetSdkVersion需要設定成22 --> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="22" /> <!-- 個推SDK權限配置開始 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <!-- ibeancon 需要藍牙權限 --> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <!-- 支援個推3.0 電子圍欄功能 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 浮動通知權限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- 自定義權限 --> <uses-permission android:name="getui.permission.GetuiService.你的包名" /><!--替換為第三方應用的包名--> <permission android:name="getui.permission.GetuiService.你的包名" android:protectionLevel="normal" > </permission><!--替換為第三方應用的包名--> <!-- 個推SDK權限配置結束 -->
- 在manifest/Application節點添加以下資訊.注意替換内容
<!--個推SDK配置開始--> <!-- 配置的第三方參數屬性 --> <meta-data android:name="PUSH_APPID" android:value="你的APPID" /><!--替換為第三方應用的APPID--> <meta-data android:name="PUSH_APPKEY" android:value="你的APPKEY" /><!--替換為第三方應用的APPKEY--> <meta-data android:name="PUSH_APPSECRET" android:value="你的APPSECRET" /><!--替換為第三方應用的APPSECRET--> <!-- 配置SDK核心服務 --> <service android:name="com.igexin.sdk.PushService" android:exported="true" android:label="NotificationCenter" android:process=":pushservice" /> <service android:name="com.igexin.sdk.PushServiceUser" android:exported="true" android:label="NotificationCenterUser" /> <receiver android:name="com.igexin.sdk.PushReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.intent.action.USER_PRESENT" /> <action android:name="com.igexin.sdk.action.refreshls" /> <!-- 以下三項為可選的action聲明,可大大提高service存活率和消息到達速度 --> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> </receiver> <receiver android:name="com.igexin.sdk.PushManagerReceiver" android:exported="false" > <intent-filter> <action android:name="com.igexin.sdk.action.pushmanager" /> </intent-filter> </receiver> <!-- 個推SDK配置結束 -->
- 在Application中初始化SDK
PushManager.getInstance().initialize(this.getApplicationContext());
- 在手機或模拟器上運作您的工程,檢視Android Monitor資訊,如圖所示。在搜尋框中輸入“clientid”可以看到“clientid is xxx”,則意味則初始化SDK成功,并擷取到相應的cid資訊,恭喜你:-D,可以開始進行推送測試了。如圖所示:
- 接收透傳消息
<!-- 在配置檔案中配置第三方Receiver --> <receiver <!-- 此處com.getui.demo.PushDemoReceiver,需要替換成開發者自己的BroadcastReceiver --> android:name="com.getui.demo.PushDemoReceiver" android:exported="false"> <intent-filter> <action android:name="com.igexin.sdk.action.你的APP_ID" /> </intent-filter> </receiver> 定義廣播接收者: public class PushDemoReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); switch (bundle.getInt(PushConsts.CMD_ACTION)) { case PushConsts.GET_MSG_DATA: // 擷取透傳資料 byte[] payload = bundle.getByteArray("payload"); if (payload != null) { String data = new String(payload); Log.d("GetuiSdkDemo", "------------receiver payload : " + data); } break; } } }
友盟
- 首頁: http://www.umeng.com/push
百度雲推送
- 首頁: http://push.baidu.com/fc
極光推送
- 首頁: https://www.jiguang.cn/push
Bug追蹤
9.1Bug追蹤_Bugly
- 首頁: http://bugly.qq.com/
- 功能:
- 及時掌握App崩潰資訊
- 支援Android NDK 開發C/C++類型的異常上報
- 使用步驟
- 通過http://bugly.qq.com/apps注冊應用
- 在module/build.gradle添加依賴
android { defaultConfig { ndk { // 設定支援的SO庫架構 abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' } } } dependencies { compile 'com.tencent.bugly:crashreport:latest.release' }
- 在gradle.properties檔案中添加:
android.useDeprecatedNdk=true
- 添權重限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_LOGS" />
- 在manifet檔案的application節點配置相關參數
<application <!-- 配置APP ID --> <meta-data android:name="BUGLY_APPID" android:value="<APP ID>" /> <!-- 配置APP版本号 --> <meta-data android:name="BUGLY_APP_VERSION" android:value="<APP Version>" /> <!-- 配置APP管道号 --> <meta-data android:name="BUGLY_APP_CHANNEL" android:value="<APP Channel>" /> <!-- 配置Bugly調試模式(true或者false)--> <meta-data android:name="BUGLY_ENABLE_DEBUG" android:value="<isDebug>" /> </application>
- 在Application中初始化Bugly
CrashReport.initCrashReport(getApplicationContext());
BugTags
- 首頁: https://www.bugtags.com/
Testin
- 首頁: http://www.testin.cn/
開源項目收集站
- https://github.com/Trinea/android-open-project
- http://colobu.com/2014/08/15/android-components-collection/
- http://android-arsenal.com/free
- https://github.com/ColorfulCat/AndroidGuide