You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
主にこういった状況は大規模なライブラリ(GuavaやApache Commons等)利用した時に起こるので、業務アプリのような比較的大規模な開発では悩まされた人も多いのではないだろうか。 今回はその問題についての説明と、対処法について紹介する。 この問題について そもそもなぜこの問題が起きるのか。 この問題の根本的な原因についてはgfxさんの記事が参考になる DalvikバイトコードのMethod数65k制限について http://d.hatena.ne.jp/gfx/20140704/1404431315 つまり、アプリケーションで定義したメソッド数が65kを超えるかどうかではなく、ひとつのdex fileで参照しているメソッド数が65kを超えるときに問題が起きる dexは簡単に言うと、コンパイルされたjavaクラスコードをAndroid上の仮想環境であるDalvikで解釈できるように変
AsyncTaskLoaderでのエラー処理 最近Androidで非同期処理を実行する場合、AsyncTaskLoaderを使用するのが一般的です。 HTTP通信等、非同期処理が必要な際によく使用していますが、 AsyncTaskLoader内で発生した例外は、外側のクラスでtry-catchを使用して捕まえることができません。 そのため、エラーハンドリング方法に悩んだ末にここで解決したので、その方法を紹介します。 AsyncTaskLoader まずはシンプルなAsyncTaskLoaderを見てみましょう。 次の例は結果をStringで返すだけのシンプルなものです。 public class AsyncService extends AsyncTaskLoader<String> { @Override public String loadInBackground() { //ここでバ
レイアウトXMLファイルから View を生成するときに LayoutInfalter の inflate() メソッドを使いますが、inflate() メソッドには引数が2つのものと3つのものがあります。 inflate(int resource, ViewGroup root) inflate(int resource, ViewGroup root, boolean attachToRoot) 引数が2つのメソッドは、内部で inflate(resource, root, root != null) のように引数が3つのメソッドを呼んでいます。 この attachToRoot に true を指定した場合と false にした場合で返ってくるルートビューが異なります。 例えば <?xml version="1.0" encoding="utf-8"?> <LinearLayout x
EclipseでAndroidアプリを開発しAPKをエクスポートしようとした際に突然現れるのが "Conversion to Dalvik format failed with error 1" のメッセージ。 私の場合、開発中にプロジェクトの Android の Project Build Target を 4(1.6) から 10(2.3.3) に変更したときなどに頻発していました。 調べると2011/7/14や2012/3/8にも遭遇していた模様⇒ 竹内裕昭(@takke)/2011年07月14日 - Twilog 竹内裕昭(@takke)/2012年03月08日 - Twilog このメッセージでググると下記のような解決策が見つかります。 プロジェクトのクリーン Eclipseの-clean プロジェクトのAndroidツール⇒「プロジェクト・プロパティを修正」 Build Pat
マスタカです。 今までandroidは作ってアップロードしていましたが、 所詮Javaなので逆コンパイルされる。 以前Java Appletを作ったら 友人に逆コンパイルされてソース全部見られた苦い過去を持つ。 でも対策のしようないんじゃないかと勝手に思っていたので 何も対策しなかったが実はproguardというものがあることを知った。 これは難読化ツールということでソースを逆コンパイルされても 読みにくくするらしい。 結局読まれちゃうんじゃないんかなという意見はあるけれど やらないよりはマシだと思ったので使ってみた。 これがなかなかうまく動かなくて1週間ドハマリしました。 以下proguardの使い方 1.最新の開発環境の構築が前提 最新の状態だと簡単にproguardが使えるので http://masterka.seesaa.net/article/235942765.html 2.p
EditText の inputType とは EditText に入力される文字の種類を限定したいとき、 inputType プロパティを指定することで IME に入力制限をかけることができます。XML で指定することもできますし、 Java から指定することもできます。例えば以下のように電話番号に使われる文字だけ入力させるようにできます。 XML で指定する場合 <EditText android:id="@+id/edit_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="phone" /> Java で指定する場合 editText.setInputType(InputType.TYPE_CLASS_PHONE); 実行結果 (POBox
DialogFragment を private なインナークラスで定義してたら、 画面の回転(Activity再生成) でアプリが落ちてしまった。 出力された例外はこれ。 Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment ErrorCaseDialogFragment: make sure class name exists, is public, and has an empty constructor that is public Fragment が private なインナークラスなので、 外部からコンストラクタ呼び出せなくて例外になった様子。 使用したコードはこんなかんじ。 ErrorCaseDialogFragment のクラス定義を private s
Fragment から Activity にコールバックしたいときに、例えばこんな感じで実装することができます。 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainFragment fragment = new MainFragment(); fragment.setOnOkBtnClickListener(new MainFragment.OnOkBtnClickListener() { @Override public void onOkClicked() { // TODO Auto-generated method stub } }); getF
こんにちは。新卒入社で今年から働き始めました、横幕です。現在は、mixiのAndroid(TM)版公式クライアントアプリを開発しています。 Android開発を始めてから数か月になりますが、今回は、開発に携わる中で知ったことをご紹介したいと思います。 レイアウトの複雑さで発生するStackOverFlowError Androidでは、見た目(UI)のデザインやレイアウトをXMLで記述することができます。XMLを書くときには、UIのパーツ(ウィジェット:ボタンやチェックボックスなど)のほか、ウィジェットの配置を決めるためのコンテナ(LinearLayoutやFrameLayoutなど)を用います。そして、それらを入れ子にしながら画面を設計していきます。 たとえば、以下のような感じに。 * main.xml <?xml version="1.0" encoding="utf-8"?> <Li
画面の縦横が切り替わると、Activity は一度終了(onPause(), onStop(), onDestroy() )させられちゃいます。 (Activity が foreground や visibleだった時は、新たなインスタンス(前のインスタンスがonSaveInstanceState メソッドで作った savedInstance を伴って)が作られます) どうしてそうなるかと言うと、 デバイスのコンフィグレーション(画面の向き、入力デバイス、言語など) が変更されたら、UIはそのコンフィグレーションにマッチするように更新 する必要があるからなんです。 例えば、縦用のレイアウトと横用のレイアウトが用意されている場合は、 リソースの再取得が必要になりますよね。 でも、コンフィグレーションの変更があっても Activity の再スタートしたくない場合はどうすればいいのでしょう? そ
開発初心者がよくやる失敗シリーズ、今回はコーディング編です。 初心者がAndroidアプリを開発していて、コーディング中によくやるミスとして以下の2点について解説します。 R.javaが消えた ActivityをManifestに登録していなくてアプリがクラッシュする R.javaが消えた R.javaは、XMLで宣言したリソースのIDを管理しているJavaファイルです。 自動で生成されるため、開発者は触れない方がいいです。 アプリを開発していて、よく起こる現象のひとつ、R.javaの喪失。 これは、xmlファイルにエラーがあることが原因で、R.javaの自動更新ができずに起こってしまう現象です。 消えてしまったR.javaを復元させるためには、方法が2つあります。 xmlファイルのエラーを取り除いた上で、上書き保存をする。 xmlファイルのエラーを取り除いた上で、プロジェクトのクリーンを
とある外注さんが書いてきたコードがひどかった。 バックグラウンドでのオーディオ再生を、Activityから作成したワーカースレッドで行う。キャンセル処理は全く考慮していない。 UIスレッド上でばんばんHTTPリクエストを投げる。応答を読み終わるまでループを回す。 アプリケーションの起動中にずっと保持する必要のある情報をIntentに書く。それを読むのはonStart()ではなくonCreate()。 Activityの初期化は全部onCreate()に書く。onStart()もonStop()も全く使ってない。 アプリケーションの起動中にずっと保持する必要のある情報をstaticメンバに持たせる。 どう悪いか説明しておこう。 Activityから起動されるワーカースレッドの寿命 たとえば画面上で表示する情報をHTTPリクエストで取得する等の処理はワーカスレッドを使うと応答性を失わずに欠くこ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く