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

すてき女性エンジニアへの道

日々の勉強ブログです。「技術で人の役に立つ、喜ばれる」女性エンジニアを目指してます✨その為の第一歩としてのブログです。成長する為にも、アドバイスなど頂けたらもの凄く喜びます。宜しくお願い致します🌸

アプリ作成:オリジナルはてなブログ用App2

こんばんは!

 

GW中を利用してせっせとApp制作に

励もうと思ってます^^

 

昨日はまずリリースするのに最低限

主要な機能や情報をあげました。

 

はてなAPIの使い方

・ログイン、ログアウト

http://auth.hatena.ne.jp/help/api

http://auth.hatena.ne.jp/help/sequence

 

・日記の表示

http://developer.hatena.ne.jp/ja/documents/bookmark/misc/feed

http://developer.hatena.ne.jp/ja/documents/star/apis/count

http://developer.hatena.ne.jp/ja/documents/blog/apis/atom

 

あれば最低限アプリとしてOKかなと。

で、どんどん他の機能を追加していく形にしよーと思います。

最初に沢山作成する機能をあげてしまうと完成が程遠くなっちゃいそうなので笑

 

アプリ作成:オリジナルはてなブログ用App

2,3日更新が止まってしまいましたが

また再開します~!

 

何かアプリを作りたいってことで

はてなブログが見やすい、使いやすい

オリジナルの

Androidアプリを作成してみよう!

と思い、5月は作成してみます◡̈

 

発信もそれに伴った発信が多くなるかも....!

 

それに伴って参考にしたサイト:

http://www.kokoro-fire.com/entry/2015/03/09/000955

 

http://shiromatakumi.hatenablog.com/entry/hatena-customize

 

http://www.future-nova.com/entry/smaho2

 

http://developer.hatena.ne.jp/ja/documents/blog/apis/atom

 

今日はあと

デザインを考えて
どんな作業が必要かを考えて
寝ます!✨

勉強:より効率的なログの活用法

Androidアプリ開発をしていて
どうもクラッシュ対応に時間がかかっているなー
原因に辿り着くのに時間がかかるし、LogCatの見方がそもそもわかってない部分があると思ったので今日のテーマは「より効率的なログの活用法」です。

1.ログを色分け
Preference > Editor > Colors & Fonts > Android Logcat

から変更できるそうです。
沢山あるうちのログの中から、どのログに注目すれば良いのか視覚的にわかりやすくなるので時間短縮に繋がるはずです!

2.自分なりの対応方法を手順化

そもそも、まだAndroid Studioに慣れてないのも問題だったり。。。
自分なりの対処方法手順化するのも良いのかも。

初心者向けに下記サイトがあったので活用させていただきます。
有難うございます(Eclipse用だけど)。

blog.clock-up.jp

 

参考サイト:

moneyforward.com

勉強:動的にコントロールを作成する方法

静的に作るばかりだったので、動的にコントロールを作成するとどんな感じか調べました。

 

参考サイト

https://akira-watson.com/android/button-hardcoding.html


ふむふむ。

今電車で満員電車なので、

帰って速攻まとめます!

 

勉強:データバインディングライブラリ?

データバインディングライブラリ知らなかった。。。 

 

ロジックとレイアウトのデータを結びつけるのに最低限のコードで済ませることができるのがこのデータバインディングライブラリ。

 

今までリストを表示する為に、プログラム上でレイアウトとデータを結び付ける処理が必要だったのですがそれを XML 内に記述ができます

 

以下引用と調べた基本的なこと↓

使用可能環境

サポート ライブラリのため、Android 2.1API レベル 7 以降)のすべての Android プラットフォーム バージョンでお使いいただけます。

データ バインディングを使うには、Android Plugin for Gradle 1.5.0-alpha1以降が必要です。

 

使用する為に

アプリでデータバイディングを使用するよう設定するには、dataBinding要素をアプリ モジュール内の build.gradle ファイルに追加します。

設定に使うコード スニペットは次のとおりです。

android {
   
....
    dataBinding
{
        enabled
= true
   
}
}

 

 

 実際に使ってみよう♫

データ バインディング用のレイアウト ファイルは通常のレイアウト ファイルとは若干異なっており、最初にルート要素の layout タグがあり、その下に data要素、view のルート要素と続きます。この view 要素は、通常のレイアウト ファイルにおけるルート要素です。サンプル ファイルは以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   
<data>
       
<variable name="user" type="com.example.User"/>
   
</data>
   
<LinearLayout
       
android:orientation="vertical"
       
android:layout_width="match_parent"
       
android:layout_height="match_parent">
       
<TextView android:layout_width="wrap_content"
           
android:layout_height="wrap_content"
           
android:text="@{user.firstName}"/>
       
<TextView android:layout_width="wrap_content"
           
android:layout_height="wrap_content"
           
android:text="@{user.lastName}"/>
   
</LinearLayout>
</layout>

data 要素内の user variable で、このレイアウトで使用するプロパティを記述します。

<variable name="user" type="com.example.User"/>

レイアウト内の式は、 "@{}" 構文を使った属性プロパティで記述します。これで、TextView のテキストが user の firstName に設定されました。

<TextView android:layout_width="wrap_content"
         
android:layout_height="wrap_content"
         
android:text="@{user.firstName}"/>

次にデータオブジェクトの指定をします。User クラスに Plain Old Java Object (POJO) を使用しているとします。

public class User {
   
public final String firstName;
   
public final String lastName;
   
public User(String firstName, String lastName) {
       
this.firstName = firstName;
       
this.lastName = lastName;
   
}
}

このタイプのオブジェクトが持つデータは変更できません。アプリでは一度だけ読み込んで、その後はまったく変更がないデータを使用することが多くあります。また、JavaBeans オブジェクトを使うこともできます。

public class User {
   
private final String firstName;
   
private final String lastName;
   
public User(String firstName, String lastName) {
       
this.firstName = firstName;
       
this.lastName = lastName;
   
}
   
public String getFirstName() {
       
return this.firstName;
   
}
   
public String getLastName() {
       
return this.lastName;
   
}
}

データ バインディングの観点では、この 2 つのクラスは同等です。TextView の android:text 属性に使われる @{user.firstName} 式は、先のクラス内で firstName フィールドに、後のクラス内で getFirstName() メソッドにアクセスすることになります。または、firstName() メソッドが存在すれば、そのメソッドに解決されます。

データのバインディングについてデフォルトでは、レイアウト ファイルの名前をパスカルケースに変換して、末尾に "Binding" をつけたものがバインディングクラスになります。上のレイアウト ファイルは main_activity.xml なので、MainActivityBinding クラスが作成されます。このクラスにはレイアウト プロパティ(user 変数)からレイアウトのビューまでのすべてのバインディングが含まれ、バインディング式に値を適用する方法が指定されています。バインディングの作成はインフレート中に行うのが最も簡単です。

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
   
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   
User user = new User("Test", "User");
   binding
.setUser(user);
}

これで完了です。アプリを実行して、UI で Test User が見えることを確認してください。次のようにしても確認できます。

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

ListView または RecyclerView アダプタ内でデータ バインディング アイテムを使う場合には、こちらの方法を使用することをお勧めします。

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

 

 

リスト、配列およびマップのアクセスについて

一般的なコレクションである配列、リスト、疎なリスト、マップには、便宜上、演算子 [] を使ってアクセスします。

<data>
   
<import type="android.util.SparseArray"/>
   
<import type="java.util.Map"/>
   
<import type="java.util.List"/>
   
<variable name="list" type="List&lt;String&gt;"/>
   
<variable name="sparse" type="SparseArray&lt;String&gt;"/>
   
<variable name="map" type="Map&lt;String, String&gt;"/>
   
<variable name="index" type="int"/>
   
<variable name="key" type="String"/>
</data>

android:text="@{list[index]}"

android:text="@{sparse[index]}"

android:text="@{map[key]}"
 

 

参考サイト:

developer.android.com

 

qiita.com

勉強:thisとgetContextの違いについて

プログラムで

thisを使っているところもあったり

getApplicationContextも使っているところもあったり

違いはなんなのかなーーー?

 

と思ったので、確認。

yuki312.blogspot.jp

 

以下引用

●Contextのライフサイクル
ApplicationContextはアプリケーションのライフサイクルと連動し、ActivityContextは
アクティビティのライフサイクルと連動しています。
つまり、2つはどちらもContextインスタンスではありますが、中身は全く異なるものに
なります。

ContextのライフサイクルについてはDeveloperページのgetApplicationContextが参考に
なります。
以下要約です。

BroadcastReceiverを登録するregistReceiverを使用するケースにおいて...
・ActivityContextを使った場合
レシーバはActivityと関連付けて登録されます。システムはActivityが破棄される
前に登録したBroadcastReceiverがunregistReceiverされることを期待します。
もしunregistReceiverされなかった場合は、フレームワークがこれをクリーンナップし、
エラーログを出力します。

・ApplicationContextを使った場合
レシーバはApplicationと関連付けて登録されグローバルな状態となる。
そのためフレームワークがこれをクリーンアップすることがなく、unregistReceiverを
忘れると容易にリークしてしまいます。

参考:http://developer.android.com/reference/android/content/Context.html#getApplicationContext()

Contextを渡す対象のAPIは、ActivityかApplicationどちらが良いのかについては、
ライフサイクルを意識することも重要であることが上記からわかります。


●Context保持によるメモリリーク問題
Contextに関するメジャーな問題としてメモリリークがあります。
前述からもわかるようにContextへの参照はActivityへの参照でもある可能性があります。

下記のようにActivityContextを長期間保持するようなコードは簡単にメモリリークを引
き起こす可能性があります。

private static Context mContext;
// ...
mContext = activityInstance;

ActivityContextはActivityのライフサイクルと連動していることを思い出してください。
private staticなmContextは、これを保持するActivityのライフサイクルが終了したとして
も、mContextによるActivityへの参照は破棄されず、メモリリークが発生します。

Contextへの参照を使用する場合に留意するべき点は下記となります。

  • Contextの参照は関連するContextのライフサイクルに合わせる
    (ApplicationContextならApplicationライフサイクルに、ActivityContextであれば
    Activityのライフサイクルに合わせること)
  • 可能であればApplicationContextの使用を考える
  • Activity内部に非staticなインナークラスの作成は極力避ける。
  • 可能であればActivityへの参照は弱参照を用いる


Context参照がリークした場合、Activityとそれに紐付くインスタンス(特にViewやBitmap等)
が諸々リークするため、予想以上に大量のメモリリークとなる恐れがあります。
場合により、ガベージコレクタによるインスタンス回収が間に合わずOutOfMemory例外が
発生することもあります。(ガベージコレクタはメモリリーク保証しない)

Contextにまつわるメモリリーク問題のより詳細な情報は下記が参考になります。
http://developer.android.com/resources/articles/avoiding-memory-leaks.html


 

ActivityContextではメモリリークの可能性に考慮する必要があるのですね。 

勉強:オブジェクトのクラス名を知りたいときは?

作業中にデバッグをしていたのですが

変数の型の確認の仕方がわかりにくかったので

もっとわかりやすい方法はないかなと思って調べました。

 

オブジェクトからクラスを取得します。

 

Object obj;

Class classObj = obj.getClass( );

 

そして、クラスのオブジェクトから名前を取得します。

String className = classObj.getName( );

 

ちゃんと取得できました><

 

参考サイト:

www.itmedia.co.jp