読者です 読者をやめる 読者になる 読者になる

アプリケーションの更新通知に関して考えてみる

 Google Playの通知をユーザさんが切っているかも?
なお話があり、アプリに実装しようかと模索してみる

 最初

あたりで実装しようと思ったのですけど、これ専用の別Activityが必須で
下手に既存のActivityに組み込むと既存の動作がおかしくなる訳ですよねorz

MarketService ms = new MarketService(activity);
ms.force(true);
ms.level(MarketService.MINOR).checkVersion();

 そんなときにTwでみつけたのがこれ

で直接弄ってみる

qiita にも言及があり
Android Asynchronous Http Clientを使ってみた - Qiita

 既存の起動時のダイアログに
更新情報があれば、更新情報を付加する感じで作ってみた感じ。
さすがにダイアログ複数出すと厳しいですからね(汗

  • キャンセル処理


client.cancelRequests(this, true);
あたりは効きが微妙かなと思う挙動をするかも。。(でもしないよりは良)

はデフォルト10秒(10*1000ミリ秒)なので短めが吉

備考)

ICS対応で一部修正。かんべんして欲しいよ‥‥‥



追記1)
ImageView用のライブラリもあるらしい(同じ作者


追記1-2)

な感じだったので、とりあえず併用イメージになるかも。。。



追記2)

JSONを受信する場合は

な形式のデータ(日本語を \uXXXX )で、対象のJSONエンコードUTF-8でないと失敗するっぽい<自前でJSON作る場合

        AsyncHttpClient client = new AsyncHttpClient();
        client.get(url, new JsonHttpResponseHandler() {

        @Override
	public void onFailure(Throwable arg0, JSONObject arg1) {
	        LogUtil.error(TAG, "JsonException:"+arg0.getStackTrace());
		super.onFailure(arg0, arg1);
	}

        @Override
        public void onSuccess(JSONObject response) {
		super.onSuccess(response);
	}

他には

  • BinaryHttpResponseHandler

等のバイナリ取得用(画像取得用?)のがあったりするけど
これでギャラリー用画像取得とかやると処理落ちするかも*1
同時実行数辺り制限書ければいいのかなーとかちょっと考察中



追記3)

オレオレSSL署名でエラーになる場合の対処

Exceptionを捨てる MySSLSocketFactory を作成して

        AsyncHttpClient client = new AsyncHttpClient();
        client.setSSLSocketFactory(mySocketFactory);

使う可能性があるのでメモ

備考)
実際使いました。
https://XXXX/hoge.png みたいなのDLするとき
BinaryHttpResponseHandlerに応答が戻ってこない・・・

設定したら嘘のようにキビキビ動くようになったなー
って感じだったりします*2

最初DownloadManager辺り使おうと思ったんですが
httpsに対応していないという記述を見つけて*3
NotoficationでURLクリックとか絡めてそれっぽいの作ってたりしてました。

後者のは特に中途半端にしか書いてないので結構困ったりしてたりも。。
*4



追記4)

一応 smart-image-view の方は

  1. コードを確認してみたら同時実行4に制限はかけているみたい
  2. addHeaderするところがないですね(汗

java - Apache HttpClient 4.0-beta2 httppost, how to add a referer? - Stack Overflow
を参照すると

request.addHeader("Referer", referer);

を追加すると良いとのことなので(referは同一鯖しか画像DL許していないのであれば、そのサイトのURL)

Android AsyncHttpClient

client.addHeader(String header, String value)

を事前に読んでやればいい感じかも



追記5)
その他の雑記メモ>

  • 端末情報を送りたいとき
    • デフォルト


android-async-http/1.4.1 (http://loopj.com/android-async-http)

これだとUserAgentを利用して端末の判定ができないので、
UserAgentを書き換えるか、端末情報をパラメータで渡すといい。

client.setUserAgent(String userAgent)
  • 同時実行数を絞りたい
    • デフォルト
    • Executors.newCachedThreadPool()

同時接続2にしたいなら

client.setThreadPool(
   (ThreadPoolExecutor)Executors.newFixedThreadPool(2)
);

なイメージにすると良

*1:ImageViewの奴はどうも同じ仕組っぽくて処理落ちしたorz

*2:Exceptionが奥に隠れてて全然見つからんかった<汗

*3:というかAndroidは基本対応してない

*4:PendingIntentのnull指定は実行時にエラーになりますしね。。。