技術情報
新人成長記録17th
今回はAndroid6.0から変更があったパーミッションについてです
なぜ今さら6.0かと言うと、かなりの時間を使い悩んでいたものが、パーミッションの許可が原因でできていなかったからです
完全にパーミッションに変更があったことを忘れていましたので、頭に残しておくためにも書いていきます
admin at 2016年12月06日 10:00:06
新人成長記録16th
admin at 2016年11月29日 10:00:13
新人成長記録15th
今回は、DB(DataBase)について書いていきます
DBは一定の形式で作成された大量のデータを保持する時に使用します
AndroidのDBにはSQLiteが使われているので、クエリを書く際にはSQLiteに則った記述をする必要があります
admin at 2016年11月22日 10:00:18
新人成長記録14th
今回はPreferenceについて書いていきます
Preferenceはキーと値の組み合わせで情報を保存し、アプリを終了してもデータを保持しているために基本的な情報などを持たせるのに良いです
ただ、アプリ(メモリデータ)を削除されてしまうとPreferenceのデータも削除されてしまうので要注意です
Preference
Preferenceで使用できる型には5つと限られています
Boolean型
Float型
Int型
Long型
String型
となります
では、どのようにPreferenceを実装していけばよいのか
まずは、SharedPreferencesクラスの取得をします
取得の仕方には色々あります
例えば、getPreference()で取得するとファイル名がPreferenceを使用したクラス名となります
統一したいのであれば、ファイル名が指定できるgetSharedPreferences()の方がよいでしょう
また、閉じた環境のみでの使用ならばPreferenceManagerクラスにある、Modeが常にprivateになるgetDefaultSharedPreferences()でも良いですね
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.edit().putInt("hogehoge", 1);
書き込み方は上記のようになり、SharedPreferencesクラスからeditを取得して値を書き込むためのputxxx()を使用して書き込みをしていきます
Preferenceから値を取得する場合には、以下のようにします
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.getInt("hogehoge",0);
2つ目の引数はもし、指定したキーに値がない場合の値のを示します
上記の場合ですと、0か値があればその値が返ってきます
非常に単純ですが、使いやすく便利なクラスなので、適所でどんどん使っていきたいですね
ただ、大量のデータの保管などには向いていないためにそういった場合には、データベースを使用した方がいいでしょう
終わりに
Preferenceは多くの場面で使うので、まとめてクラスとして保持した方が追加や修正をしやすいと思います
また、使うたびにSharedPreferencesクラスを取得する手間も省けます
特殊な方法ですが、GSONというGoogleから提供されているオープンソースライブラリを使用することで、オブジェクトをJSONデータに変換することで、文字列としてPreferenceに保存することができます
戻す時もJSONデータをPreferenceから受け取り、GSONを使用してオブジェクトに戻すことができます
火曜日担当:poppy
admin at 2016年11月15日 10:22:49
新人成長記録13th
AsyncTaskについて
今回もAndroidにおける非同期処理について書いていきます
前回はThreadでの非同期処理を書きました
今回はAsyncTaskについてです
AsyncTask
Threadでは、基本的にUIスレッドを使うことはできませんでした(Handlerを使えばUIスレッドへ投げられますけどね)
AsyncTaskではUIスレッドと関係のある非同期処理を行うことができます
例えば、長い処理の間の待ちとしてプログレスダイアログを表示することができます
現在の処理が全体の何パーセントか、何件中の何件処理完了とかですね
このようなダイアログを表示することでユーザにも現在の進行が分かるようになります
プログラムの内容は以下のようになります。
public class AsyncFrag extends AsyncTask<Integer, Integer, Boolean> {
Context context;
ProgressDialog dialog;
public AsyncFrag(Context context){
this.context = context;
}
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(context);
dialog.setTitle("Please wait");
dialog.setMessage("Loading data...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.setMax(100);
dialog.show();
}
@Override
protected Boolean doInBackground(Integer... params){
for(int i=0;i<100;i++){
if(isCancelled()){
return false;
}
try {
Thread.sleep(300/(i%3 + 1));
publishProgress(1);
}catch (Exception e){}
}
publishProgress(1);
return true;
}
protected void onProgressUpdate(Integer... params){
dialog.incrementProgressBy(1);
}
@Override
protected void onPostExecute(Boolean result) {
if(dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
@Override
protected void onCancelled(){
Log.d("debug","onCancelled");
if(dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
}
AsyncTaskを使うときには必要な引数は3つあります
1つ目は、doInBackgroundメソッドの引数となっており、メインの処理で呼ぶ際に受け渡す値となります
2つ目は、opProgressUpdateメソッドの引数となっており、表示しているダイアログの更新などに使えます
3つ目は、doInBackgroundメソッドの返り値で、onPostExecuteメソッドの引数となっています
2つ目の引数に関しては、onProgressUpdateメソッドの必要がない場合には、Voidを指定してもいいですし、なにか適当に指定するのもいいです
それでは、このクラスの中での処理の流れを説明していきます
最初に、onPreExecuteが処理されます
ここでは、UIを変更することができるので、ここでダイアログを表示します
次にdoInBackgroundが処理されます
ここは、Uiスレッドとは異なるスレッドでの処理なのでUIの編集はできませんので注意が必要です
publishProgressでonProgressUpdateに処理を渡すことができますので、処理の中でのループで呼ぶようにしてあげると、ダイアログの更新を頻繁にでき、処理完了までの割合などが伝えることができます
ここが正常に終わるとonPostExecuteが処理されます
ここでもUIの処理ができるので、表示してあるダイアログを消したり、テキストの編集をしたりできます
また、非同期処理中にcancelがされているとdoInBackgroundの中でisCancelで判定し終了させるか、処理がすべて終わると
onCancelledが処理されます
この中でもダイアログを閉じる処理を入れるようにすることが必要です
呼び出し方
メイン処理からAsyncTaskを呼び出す時には、以下のようにします
asyncFrag = new AsyncFrag(this);
asyncFrag.execute(view.getId());
これだけで非同期処理の実行が可能です
終わりに
Androidで非同期処理を行うには、UIの操作ができないですが、そもそもUIと処理を密接な関係にしている処理内容がダメなんじゃないかと少し思いました
ダイアログだけだして裏でUIが絡む処理をしているとプログレスダイアログでは、くるくる回る動作をせず少しダサい気がします
出来る限り、時間のかかる処理とUIの操作は分けるように作っていきたいです
admin at 2016年11月08日 10:00:28