前の10件 | -
カフェラッテ [デザート]
森永乳業のマウントレーニア カフェラッテ
かれこれ18年ぐらい前から飲み続けている。
非常に!非常に好きで多いときには1日5本ぐらい飲む。
ただ、最近、、、カロリーを妻に指摘されさらに本数制限まで
このカフェラッテ、仕事の息抜きや何気ない時間でも非常にリラックス出来るのに制限をくらってしまった。。。
抵抗もした。
「エスプレッソやキャラメルは飲まない。カフェラッテしか飲まない!」・・・私
「意味分からない。」・・・妻
「・・・」・・・私
18年ぐらい毎日飲み続けてきたカフェラッテを制限されるとは思ってもいなかった。
カフェラッテを心から愛し飲み続けてきた者にとって制限されることは苦痛である。
仕事中に飲むのはバレないからいいとして家で飲める本数が減るのは苦痛である。
カロリーオフのみあるがどこか物足りない。あのミルクとのバランスがあってのカフェラッテである!
18年ってすごいですよ!子供が生まれて高校卒業するぐらいですよ!
それだけ飲み続けてきたのに
とりあえず、家で飲む本数を減らし外で飲む本数を増やすことで抵抗していくつもである。
かれこれ18年ぐらい前から飲み続けている。
非常に!非常に好きで多いときには1日5本ぐらい飲む。
ただ、最近、、、カロリーを妻に指摘されさらに本数制限まで
このカフェラッテ、仕事の息抜きや何気ない時間でも非常にリラックス出来るのに制限をくらってしまった。。。
抵抗もした。
「エスプレッソやキャラメルは飲まない。カフェラッテしか飲まない!」・・・私
「意味分からない。」・・・妻
「・・・」・・・私
18年ぐらい毎日飲み続けてきたカフェラッテを制限されるとは思ってもいなかった。
カフェラッテを心から愛し飲み続けてきた者にとって制限されることは苦痛である。
仕事中に飲むのはバレないからいいとして家で飲める本数が減るのは苦痛である。
カロリーオフのみあるがどこか物足りない。あのミルクとのバランスがあってのカフェラッテである!
18年ってすごいですよ!子供が生まれて高校卒業するぐらいですよ!
それだけ飲み続けてきたのに
とりあえず、家で飲む本数を減らし外で飲む本数を増やすことで抵抗していくつもである。
マイナス金利2 [経済]
日銀がマイナス金利の導入を決めてから約1週間が経つ。
決定直後は株高・円安が進んだが、5日までに日経平均株価が1万7000円台を割り込んだ。
結局、外国為替市場でも円高が進行し日銀の決定前の水準に逆戻りした。
「マイナス金利」はなんだったのだ?確かに「マイナス金利」は発表したが開始はしてない。開始したら効果が出るのかもしれないが到底そうは思えない。
さらにメガバンクが定期預金金利の引き下げを発表した。なんと100万円を1年預けて金利は10円程度らしい。
ただ、住宅ローンの金利も下げるので全てがマイナスになるわけではない。
これから先、景気は回復するのだろうか?
なにを基準に回復したと判断するのだろうか?
決定直後は株高・円安が進んだが、5日までに日経平均株価が1万7000円台を割り込んだ。
結局、外国為替市場でも円高が進行し日銀の決定前の水準に逆戻りした。
「マイナス金利」はなんだったのだ?確かに「マイナス金利」は発表したが開始はしてない。開始したら効果が出るのかもしれないが到底そうは思えない。
さらにメガバンクが定期預金金利の引き下げを発表した。なんと100万円を1年預けて金利は10円程度らしい。
ただ、住宅ローンの金利も下げるので全てがマイナスになるわけではない。
これから先、景気は回復するのだろうか?
なにを基準に回復したと判断するのだろうか?
フレッシュジュース [健康]
妻が果物・野菜を搾ってフレッシュジュースを作ってくれた。
搾って作るフレッシュジュースはお店でしか飲んだことがない。
材料を横から見た。嫌いな人参がまるまる1本置いてある。まさか人参も入れるの???
『人参は入れないで』・・・私
『人参入れた方が甘くて美味しいよ』・・・妻
まさか?人参だよ?
『とりあえず最初は入れないで作って?』・・・私
最初に搾った材料はりんご、みかんの2種類。
、、、美味しい
、、、次、人参をプラス、、、
ん???さっきより甘くて美味しい
『やっぱり人参入れて良いよ』・・・私
ほら言ったでしょ!と思ってムスッとしている妻。
そんなの気にせずおかわり。
次にりんご、グレープフルーツ、人参で作った。
これまた美味しい。先ほどのより若干グレープフルーツの渋みがあるがこれはこれで美味しい。
凄く気に入ったのでまた作ってと言ったら材料費が高いからしばらく無理とのこと
確かに、果物・野菜をそのまま使用して飲める量はそんなに多くない。不経済ではある、、、。
搾って作るフレッシュジュースはお店でしか飲んだことがない。
材料を横から見た。嫌いな人参がまるまる1本置いてある。まさか人参も入れるの???
『人参は入れないで』・・・私
『人参入れた方が甘くて美味しいよ』・・・妻
まさか?人参だよ?
『とりあえず最初は入れないで作って?』・・・私
最初に搾った材料はりんご、みかんの2種類。
、、、美味しい
、、、次、人参をプラス、、、
ん???さっきより甘くて美味しい
『やっぱり人参入れて良いよ』・・・私
ほら言ったでしょ!と思ってムスッとしている妻。
そんなの気にせずおかわり。
次にりんご、グレープフルーツ、人参で作った。
これまた美味しい。先ほどのより若干グレープフルーツの渋みがあるがこれはこれで美味しい。
凄く気に入ったのでまた作ってと言ったら材料費が高いからしばらく無理とのこと
確かに、果物・野菜をそのまま使用して飲める量はそんなに多くない。不経済ではある、、、。
下肢静脈瘤・・・その後 [病気]
以前、妻が下肢静脈瘤で手術することになった事を書いたが今日、再度手術によるキズなどの説明を聞きに行ってきた。
手術は20分ぐらいで済むらしい。
だが内部を焼くので線上に色が沈着するらしい。
時間と共にある程度綺麗になるが多少は後が残るのは理解して欲しい。と、言われた。
妻はためらった。
すると医者は下肢静脈瘤はやっと保険適用になったばかりでこれからどんどん技術も進化する。
だから、今すぐ手術せず様子を見るのはどうですか?
この提案に妻は承諾した。
やはり、女性として足に跡が残るのは辛いみたいだ、、、。
とりあえず当面、3ヶ月おきに通院して様子を見ることにした。
早く、早く技術が進化して欲しい。
手術は20分ぐらいで済むらしい。
だが内部を焼くので線上に色が沈着するらしい。
時間と共にある程度綺麗になるが多少は後が残るのは理解して欲しい。と、言われた。
妻はためらった。
すると医者は下肢静脈瘤はやっと保険適用になったばかりでこれからどんどん技術も進化する。
だから、今すぐ手術せず様子を見るのはどうですか?
この提案に妻は承諾した。
やはり、女性として足に跡が残るのは辛いみたいだ、、、。
とりあえず当面、3ヶ月おきに通院して様子を見ることにした。
早く、早く技術が進化して欲しい。
マイナス金利 [経済]
先日、日銀が『マイナス金利』を導入すると発表した。
マイナス金利??
と、疑問を持っていた。マイナス金利でなぜ景気を良くなるの?
やっと分かった。
日銀以外の銀行は大小あるが日銀に預金している。目的はその預金に対しての金利である。
今回のマイナス金利になると預金しているだけ金利が付くどころかマイナスになっていく(預金すれば必ずマイナスになるわけではなく段階が設けている)。
そうなると、日銀以外の銀行は日銀への預金額を減らすか止めるなどの処置を取る。
ただ、そうなると今まで預金による金利分をどう作るか?になる。
そこで、銀行は企業や個人などに対する投資を増やしこれに対する金利で補おうとする。
つまり、お金が循環するようになり結果、景気向上に結びつくというのだ。
ただ、銀行が投資する際には厳しい審査があるので日銀が狙う程お金が循環するのだろうか?
ドラマ『半沢直樹』ではないが回収の目処がある企業や個人にしか投資はされないと思う。
それでは今までと変わらないのでは?
ん~。。。投資家などどう受け止めてるのだろう?
マイナス金利??
と、疑問を持っていた。マイナス金利でなぜ景気を良くなるの?
やっと分かった。
日銀以外の銀行は大小あるが日銀に預金している。目的はその預金に対しての金利である。
今回のマイナス金利になると預金しているだけ金利が付くどころかマイナスになっていく(預金すれば必ずマイナスになるわけではなく段階が設けている)。
そうなると、日銀以外の銀行は日銀への預金額を減らすか止めるなどの処置を取る。
ただ、そうなると今まで預金による金利分をどう作るか?になる。
そこで、銀行は企業や個人などに対する投資を増やしこれに対する金利で補おうとする。
つまり、お金が循環するようになり結果、景気向上に結びつくというのだ。
ただ、銀行が投資する際には厳しい審査があるので日銀が狙う程お金が循環するのだろうか?
ドラマ『半沢直樹』ではないが回収の目処がある企業や個人にしか投資はされないと思う。
それでは今までと変わらないのでは?
ん~。。。投資家などどう受け止めてるのだろう?
映画『オデッセイ』・・・マット・デイモン [映画]
2月5日公開の映画『オデッセイ』
面白そう観に行きたい!
マット・デイモンの映画では『グッド・ウィル・ハンティング』が好きだが他のマット・デイモン主演映画はあまり記憶にない。
今回の『オデッセイ』は火星で科学により生きる。この科学による部分が非常に興味がある。
火星に関連する映画は今まで沢山あるが大抵火星をどう脱出するかでどう生きるかではなかった。
生きる為に知識を使い、科学を活かす内容に惹かれる。
私は映画を観てすごく共感したり面白かった場合、その原作があれば読む事が多い。
先に読んでしまうと映画を楽しめない。後で読めば映画では描かれていない部分などを知ることが出来てより一層映画の良さを実感できるから。
今回の『オデッセイ』の原作は『火星の人』。
是非、原作を読みたいと思える映画であって欲しい。
面白そう観に行きたい!
マット・デイモンの映画では『グッド・ウィル・ハンティング』が好きだが他のマット・デイモン主演映画はあまり記憶にない。
今回の『オデッセイ』は火星で科学により生きる。この科学による部分が非常に興味がある。
火星に関連する映画は今まで沢山あるが大抵火星をどう脱出するかでどう生きるかではなかった。
生きる為に知識を使い、科学を活かす内容に惹かれる。
私は映画を観てすごく共感したり面白かった場合、その原作があれば読む事が多い。
先に読んでしまうと映画を楽しめない。後で読めば映画では描かれていない部分などを知ることが出来てより一層映画の良さを実感できるから。
今回の『オデッセイ』の原作は『火星の人』。
是非、原作を読みたいと思える映画であって欲しい。
Android・・・Volley【画像読み込み】 [Android]
先日の『Android・・・Volley』に今度は画像読み込み処理を追加した。
今回はリストビューのリストに画像を設定していく処理を備忘録として記載する。
---------------------------------------------------------------
■Volleyの実装サンプル
---------------------------------------------------------------
①Volleyインスタンス作成・停止クラス
※Volleyはシングルインスタンスで扱うようにすること。
※画像ローダーのインスタンス作成を追加
public class VolleyHelper {
private static final Object sLock = new Object();
private static RequestQueue sQueue;
private static ImageLoaderPlus sImageLoader;
public static void resetVolley() {
if (sQueue != null) {
cancelQueue();
sQueue.stop();
}
sQueue = null;
}
public static void addRequest(final Context conetxt, JsonObjectRequest request) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.add(request);
}
/**
* Volleyインスタンス作成処理
*
* @param conetxt コンテキスト
* @return Volleyインスタンス
*/
public static RequestQueue getRequestQueue(final Context conetxt) {
synchronized (sLock) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
return sQueue;
}
}
public static void startQueue(final Context conetxt) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.start();
}
public static void cancelQueue() {
if (sQueue != null) {
sQueue.cancelAll(new RequestFilter() {;
@Override
public boolean apply(Request request) {
return true;
}
});
}
}
public static void stopQueue() {
if (sQueue != null) {
sQueue.stop();
sQueue = null;
}
}
/**
* リストまたはグリッドなど複数画像取得時のローダーインスタンス作成処理
*
* @param conetxt コンテキスト
* @param bitmapCache キャッシュ容量設定
* @return ローダーインスタンス
*/
public static ImageLoaderPlus getImageLoader(final Context conetxt, BitmapCache bitmapCache) {
synchronized (sLock) {
if (sImageLoader == null) {
sImageLoader = new ImageLoaderPlus(getRequestQueue(conetxt), bitmapCache);
}
return sImageLoader;
}
}
}
②Bitmapキャッシュクラス
※キャッシュサイズクラスを作成し柔軟にサイズ調整できるようにする。
public class BitmapCache implements ImageLoader.ImageCache {
public static final Object sLock = new Object();
private static LruCache mCache;
public BitmapCache() {
synchronized (sLock) {
if (mCache == null) {
int maxSize = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxSize / 8;
mCache = new LruCache(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
}
}
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
③アダプタによる画像読み込み・設定クラス
※画像の読み込み時は必ずローダーのキャンセルチェックを行うこと。
public class MyAdapter extends BaseAdapter {
/** コンテキスト */
private Context mContext;
private LayoutInflater mInflater;
/** リスト数 */
private int mListNum = 0;
/** 画像キャッシュ */
private BitmapCache mCache = new BitmapCache();
public InfoListAdapter(Context context, int itemCount) {
mContext = context;
mListNum = itemCount;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mListNum;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// 本来は高速かなど考慮する為、下記のように都度viewを設定することはない(あくまでサンプル)
view = (InfoListLayout) mInflater.inflate(R.layout.listview, null);
// リクエストのキャンセル処理
ImageView image = (ImageView) view.findViewById(R.id.image);
ImageLoaderPlus.ImageContainer imageContainer = (ImageLoaderPlus.ImageContainer) image.getTag();
if (imageContainer != null) {
imageContainer.cancelRequest();
}
String imageUrl = "xxxxx.png";
ImageLoaderPlus.ImageListener listener =
ImageLoaderPlus.getImageListener(
image,
R.drawable.waiting,
R.drawable.error);
image.setTag(VolleyHelper.getImageLoader(mContext, mCache).get(imageUrl, listener));
}
return view;
}
}
後はActivityやFragment等でお決まりのリスト作成すればよい。
リスト作成時のgetView内でviewを作成する部分だが通常はレイアウトの使い回しなどを行い高速処理を施す。昔から行われているのはレイアウトをstaticで保持して使いまわす方法だがこれとは違う方法を私は実装する。次回はこの部分を備忘録として記載しる予定である。
今回はリストビューのリストに画像を設定していく処理を備忘録として記載する。
---------------------------------------------------------------
■Volleyの実装サンプル
---------------------------------------------------------------
①Volleyインスタンス作成・停止クラス
※Volleyはシングルインスタンスで扱うようにすること。
※画像ローダーのインスタンス作成を追加
public class VolleyHelper {
private static final Object sLock = new Object();
private static RequestQueue sQueue;
private static ImageLoaderPlus sImageLoader;
public static void resetVolley() {
if (sQueue != null) {
cancelQueue();
sQueue.stop();
}
sQueue = null;
}
public static void addRequest(final Context conetxt, JsonObjectRequest request) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.add(request);
}
/**
* Volleyインスタンス作成処理
*
* @param conetxt コンテキスト
* @return Volleyインスタンス
*/
public static RequestQueue getRequestQueue(final Context conetxt) {
synchronized (sLock) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
return sQueue;
}
}
public static void startQueue(final Context conetxt) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.start();
}
public static void cancelQueue() {
if (sQueue != null) {
sQueue.cancelAll(new RequestFilter() {;
@Override
public boolean apply(Request request) {
return true;
}
});
}
}
public static void stopQueue() {
if (sQueue != null) {
sQueue.stop();
sQueue = null;
}
}
/**
* リストまたはグリッドなど複数画像取得時のローダーインスタンス作成処理
*
* @param conetxt コンテキスト
* @param bitmapCache キャッシュ容量設定
* @return ローダーインスタンス
*/
public static ImageLoaderPlus getImageLoader(final Context conetxt, BitmapCache bitmapCache) {
synchronized (sLock) {
if (sImageLoader == null) {
sImageLoader = new ImageLoaderPlus(getRequestQueue(conetxt), bitmapCache);
}
return sImageLoader;
}
}
}
②Bitmapキャッシュクラス
※キャッシュサイズクラスを作成し柔軟にサイズ調整できるようにする。
public class BitmapCache implements ImageLoader.ImageCache {
public static final Object sLock = new Object();
private static LruCache
public BitmapCache() {
synchronized (sLock) {
if (mCache == null) {
int maxSize = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxSize / 8;
mCache = new LruCache
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
}
}
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
③アダプタによる画像読み込み・設定クラス
※画像の読み込み時は必ずローダーのキャンセルチェックを行うこと。
public class MyAdapter extends BaseAdapter {
/** コンテキスト */
private Context mContext;
private LayoutInflater mInflater;
/** リスト数 */
private int mListNum = 0;
/** 画像キャッシュ */
private BitmapCache mCache = new BitmapCache();
public InfoListAdapter(Context context, int itemCount) {
mContext = context;
mListNum = itemCount;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mListNum;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// 本来は高速かなど考慮する為、下記のように都度viewを設定することはない(あくまでサンプル)
view = (InfoListLayout) mInflater.inflate(R.layout.listview, null);
// リクエストのキャンセル処理
ImageView image = (ImageView) view.findViewById(R.id.image);
ImageLoaderPlus.ImageContainer imageContainer = (ImageLoaderPlus.ImageContainer) image.getTag();
if (imageContainer != null) {
imageContainer.cancelRequest();
}
String imageUrl = "xxxxx.png";
ImageLoaderPlus.ImageListener listener =
ImageLoaderPlus.getImageListener(
image,
R.drawable.waiting,
R.drawable.error);
image.setTag(VolleyHelper.getImageLoader(mContext, mCache).get(imageUrl, listener));
}
return view;
}
}
後はActivityやFragment等でお決まりのリスト作成すればよい。
リスト作成時のgetView内でviewを作成する部分だが通常はレイアウトの使い回しなどを行い高速処理を施す。昔から行われているのはレイアウトをstaticで保持して使いまわす方法だがこれとは違う方法を私は実装する。次回はこの部分を備忘録として記載しる予定である。
Android・・・Volley [Android]
あるアプリ作成での通信処理部分を今回はVolleyを使用して作成した。
理由としてはJSONデータを送受信するのみの通信処理だった為。
そして、備忘録として処理を残す。
※今回はJSONデータを送受信するのみだったので最低限の処理のみだが今後画像なども扱う場合は処理内容を追加していく。
■Volleyの公式リポジトリ
https://android.googlesource.com/platform/frameworks/volley/
■Volleyのドキュメント
http://developer.android.com/intl/ja/training/volley/index.html
Volleyは以下の通信処理を効率的に支援してくれている。
・データ取得処理(JSON、XMLなど)
・データパース処理
・表示情報取得処理(画像、テキストなど)
・画面への設定処理(ImageView)
---------------------------------------------------------------
■開発環境
---------------------------------------------------------------
・Windows 7
・Android Studio 1.5
---------------------------------------------------------------
■Volleyの導入
---------------------------------------------------------------
Volleyをプロジェクトに導入するには以下の2つ方法がある。
①gitでVolleyプロジェクトを追加する
Volleyの公式リポジトリよりVolleyを取り組み、開発プロジェクトに追加する。
そして、build.gradle(Module:app)に以下を追加する。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':volley')
}
・メリットについて
プロジェクトごと取り込むので、Volleyの内容についてのカスタマイズ等が可能である。
・デメリットについて
ビルド時に依存関係の解決がされないので場合によって競合が起きる。
②外部リポジトリから取り込む
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.mcxiaoke.volley:library:1.0.+'
}
・メリットについて
バージョン指定が出来、ビルド時の依存関係も意識する必要がない。
・デメリットについて
公開停止になれば使えなくなるのと、Volleyの内容についてのカスタマイズ等が不可能である。
---------------------------------------------------------------
■Volleyの実装サンプル
---------------------------------------------------------------
①Volleyインスタンス作成・停止クラス
※Volleyはシングルインスタンスで扱うようにすること。
public class VolleyHelper {
private static final Object sLock = new Object();
private static RequestQueue sQueue;
public static void resetVolley() {
if (sQueue != null) {
sQueue.stop();
}
sQueue = null;
}
public static void addRequest(final Context conetxt, JsonObjectRequest request) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.add(request);
}
/**
* Volleyインスタンス作成処理
*
* @param conetxt コンテキスト
* @return Volleyインスタンス
*/
public static RequestQueue getRequestQueue(final Context conetxt) {
synchronized (sLock) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
return sQueue;
}
}
public static void startQueue(final Context conetxt) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.start();
}
public static void cancelQueue() {
if (sQueue != null) {
sQueue.cancelAll(new RequestFilter() {;
@Override
public boolean apply(Request request) {
return true;
}
});
}
}
public static void stopQueue() {
if (sQueue != null) {
sQueue.stop();
sQueue = null;
}
}
}
②Volley通信処理のタイムアウト及びリトライ回数設定クラス
public class VolleyRetryPolicy extends DefaultRetryPolicy {
/** タイムアウト値 */
private static final int CONNECTION_TIMEOUT = 10000;
/** リトライ回数(初回リクエスト失敗後の回数) */
private static final int CONNECTION_RETRY_NUM = 5;
/** インターバル値 */
private final long INTERVAL_TIME = 3000;
private Request mRequest;
public VolleyRetryPolicy(Request request) {
super(CONNECTION_TIMEOUT, CONNECTION_RETRY_NUM, 1f);
mRequest = request;
}
@Override
public void retry(VolleyError error) throws VolleyError {
NetworkResponse response = error.networkResponse;
if (response != null && response.statusCode >= 500 && response.statusCode < 600) {
throw error;
}
if (mRequest != null && mRequest.isCanceled()) {
throw error;
}
if (INTERVAL_TIME > 0 ) {
try {
Thread.sleep(INTERVAL_TIME);
}
catch (InterruptedException e) {
}
}
super.retry(error);
}
}
③Activityクラス
今回はサンプルなのでActivity内でVolleyをコールして通信する。
public class MainActivity extends AppCompatActivity {
/** 通信リクエスト */
protected JsonObjectRequest mRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
VolleyHelper.getRequestQueue(getApplicationContext());
startQueue();
}
@Override
protected void onDestroy() {
super.onDestroy();
VolleyHelper.cancelQueue();
VolleyHelper.stopQueue();
}
private void startQueue() {
final String url = "http://xxxxx/xxxxx(通信先URL)";
mRequest = new JsonObjectRequest(
Request.Method.GET,
url,
null,
// 通信成功時の処理
new Response.Listener() {
public void onResponse(JSONObject jsonRoot) {
//JSON解析処理記述
・・・
}
}
},
// 通信失敗時の処理
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// ダイアログ等 }
});
// リクエストのリトライ及びタイムアウト設定
mRequest.setRetryPolicy(new VolleyRetryPolicy(mRequest));
VolleyHelper.addRequest(getApplicationContext(), mRequest);
}
}
理由としてはJSONデータを送受信するのみの通信処理だった為。
そして、備忘録として処理を残す。
※今回はJSONデータを送受信するのみだったので最低限の処理のみだが今後画像なども扱う場合は処理内容を追加していく。
■Volleyの公式リポジトリ
https://android.googlesource.com/platform/frameworks/volley/
■Volleyのドキュメント
http://developer.android.com/intl/ja/training/volley/index.html
Volleyは以下の通信処理を効率的に支援してくれている。
・データ取得処理(JSON、XMLなど)
・データパース処理
・表示情報取得処理(画像、テキストなど)
・画面への設定処理(ImageView)
---------------------------------------------------------------
■開発環境
---------------------------------------------------------------
・Windows 7
・Android Studio 1.5
---------------------------------------------------------------
■Volleyの導入
---------------------------------------------------------------
Volleyをプロジェクトに導入するには以下の2つ方法がある。
①gitでVolleyプロジェクトを追加する
Volleyの公式リポジトリよりVolleyを取り組み、開発プロジェクトに追加する。
そして、build.gradle(Module:app)に以下を追加する。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':volley')
}
・メリットについて
プロジェクトごと取り込むので、Volleyの内容についてのカスタマイズ等が可能である。
・デメリットについて
ビルド時に依存関係の解決がされないので場合によって競合が起きる。
②外部リポジトリから取り込む
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.mcxiaoke.volley:library:1.0.+'
}
・メリットについて
バージョン指定が出来、ビルド時の依存関係も意識する必要がない。
・デメリットについて
公開停止になれば使えなくなるのと、Volleyの内容についてのカスタマイズ等が不可能である。
---------------------------------------------------------------
■Volleyの実装サンプル
---------------------------------------------------------------
①Volleyインスタンス作成・停止クラス
※Volleyはシングルインスタンスで扱うようにすること。
public class VolleyHelper {
private static final Object sLock = new Object();
private static RequestQueue sQueue;
public static void resetVolley() {
if (sQueue != null) {
sQueue.stop();
}
sQueue = null;
}
public static void addRequest(final Context conetxt, JsonObjectRequest request) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.add(request);
}
/**
* Volleyインスタンス作成処理
*
* @param conetxt コンテキスト
* @return Volleyインスタンス
*/
public static RequestQueue getRequestQueue(final Context conetxt) {
synchronized (sLock) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
return sQueue;
}
}
public static void startQueue(final Context conetxt) {
if (sQueue == null) {
sQueue = Volley.newRequestQueue(conetxt);
}
sQueue.start();
}
public static void cancelQueue() {
if (sQueue != null) {
sQueue.cancelAll(new RequestFilter() {;
@Override
public boolean apply(Request request) {
return true;
}
});
}
}
public static void stopQueue() {
if (sQueue != null) {
sQueue.stop();
sQueue = null;
}
}
}
②Volley通信処理のタイムアウト及びリトライ回数設定クラス
public class VolleyRetryPolicy extends DefaultRetryPolicy {
/** タイムアウト値 */
private static final int CONNECTION_TIMEOUT = 10000;
/** リトライ回数(初回リクエスト失敗後の回数) */
private static final int CONNECTION_RETRY_NUM = 5;
/** インターバル値 */
private final long INTERVAL_TIME = 3000;
private Request mRequest;
public VolleyRetryPolicy(Request request) {
super(CONNECTION_TIMEOUT, CONNECTION_RETRY_NUM, 1f);
mRequest = request;
}
@Override
public void retry(VolleyError error) throws VolleyError {
NetworkResponse response = error.networkResponse;
if (response != null && response.statusCode >= 500 && response.statusCode < 600) {
throw error;
}
if (mRequest != null && mRequest.isCanceled()) {
throw error;
}
if (INTERVAL_TIME > 0 ) {
try {
Thread.sleep(INTERVAL_TIME);
}
catch (InterruptedException e) {
}
}
super.retry(error);
}
}
③Activityクラス
今回はサンプルなのでActivity内でVolleyをコールして通信する。
public class MainActivity extends AppCompatActivity {
/** 通信リクエスト */
protected JsonObjectRequest mRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
VolleyHelper.getRequestQueue(getApplicationContext());
startQueue();
}
@Override
protected void onDestroy() {
super.onDestroy();
VolleyHelper.cancelQueue();
VolleyHelper.stopQueue();
}
private void startQueue() {
final String url = "http://xxxxx/xxxxx(通信先URL)";
mRequest = new JsonObjectRequest(
Request.Method.GET,
url,
null,
// 通信成功時の処理
new Response.Listener
public void onResponse(JSONObject jsonRoot) {
//JSON解析処理記述
・・・
}
}
},
// 通信失敗時の処理
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// ダイアログ等 }
});
// リクエストのリトライ及びタイムアウト設定
mRequest.setRetryPolicy(new VolleyRetryPolicy(mRequest));
VolleyHelper.addRequest(getApplicationContext(), mRequest);
}
}
パンケーキ [デザート]
妻が今年の誕生日に
『パンケーキが食べたい』・・・妻
と言い出した。
『ホットケーキは?』・・・私
『パンケーキ!』・・・妻
まあ、かわいいお願いだからOKした。ちなみにこういうのは無知なので人気のお店など知らない。
そこで、妻に行きたいお店があるのか聞いてみた。
『レインボーパンケーキ』店に行きたい。
なんとカラフルな名前、、、。まだ誕生日は先なのでとりあえず検索、検索。
かなり人気なお店、しかもすごく並ぶ
ラーメン屋なら並ぶがパンケーキに並ぶのは考えたことがなかった。
パンケーキ恐るべし
『パンケーキが食べたい』・・・妻
と言い出した。
『ホットケーキは?』・・・私
『パンケーキ!』・・・妻
まあ、かわいいお願いだからOKした。ちなみにこういうのは無知なので人気のお店など知らない。
そこで、妻に行きたいお店があるのか聞いてみた。
『レインボーパンケーキ』店に行きたい。
なんとカラフルな名前、、、。まだ誕生日は先なのでとりあえず検索、検索。
かなり人気なお店、しかもすごく並ぶ
ラーメン屋なら並ぶがパンケーキに並ぶのは考えたことがなかった。
パンケーキ恐るべし
Android・・・NumberPickerの文字サイズ/文字色変更 [Android]
AndroidのNumberPickerによる数字のロール表示について文字サイズを変更した時の備忘録。
最初、NumberPickerからEditTextを取得しそれに対して文字サイズと文字色を設定したが中心部分の文字サイズ及び文字色は設定した通りになったが少しでも上下にスクロールすると元に戻ってしまった。
調べるとスクロールする度にレイアウトに対してViewが追加されていた。それによってレイアウトの設定情報がクリアされてしまうのでその追加される部分で文字サイズと文字色を設定するように変更。
下記はNumberPickerを継承したクラスを用意して文字サイズと文字色を変更した実装サンプルになる。
このクラスを表示したViewに追加すればロール型の数字スクロール表示が出来る。
------------------------------------------------------------------------
■実装
------------------------------------------------------------------------
public class MyNumberPicker extends NumberPicker {
public MyNumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void addView(View child, ViewGroup.LayoutParams params) {
super.addView(child, params);
updateView(child);
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
super.addView(child, index, params);
updateView(child);
}
private void updateView(View child) {
if (child instanceof EditText) {
((EditText) child).setTextSize(TypedValue.COMPLEX_UNIT_SP, 20.0f);
((EditText) child).setTextColor(Color.BLACK);
}
}
}
とりあえず、これで期待通り文字サイズも文字色も変更出来た。
最初、NumberPickerからEditTextを取得しそれに対して文字サイズと文字色を設定したが中心部分の文字サイズ及び文字色は設定した通りになったが少しでも上下にスクロールすると元に戻ってしまった。
調べるとスクロールする度にレイアウトに対してViewが追加されていた。それによってレイアウトの設定情報がクリアされてしまうのでその追加される部分で文字サイズと文字色を設定するように変更。
下記はNumberPickerを継承したクラスを用意して文字サイズと文字色を変更した実装サンプルになる。
このクラスを表示したViewに追加すればロール型の数字スクロール表示が出来る。
------------------------------------------------------------------------
■実装
------------------------------------------------------------------------
public class MyNumberPicker extends NumberPicker {
public MyNumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void addView(View child, ViewGroup.LayoutParams params) {
super.addView(child, params);
updateView(child);
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
super.addView(child, index, params);
updateView(child);
}
private void updateView(View child) {
if (child instanceof EditText) {
((EditText) child).setTextSize(TypedValue.COMPLEX_UNIT_SP, 20.0f);
((EditText) child).setTextColor(Color.BLACK);
}
}
}
とりあえず、これで期待通り文字サイズも文字色も変更出来た。
前の10件 | -