カテゴリー: Java

Android タブレット アプリ開発でNetworkOnMainThreadException発生

投稿者:isc_blog

Androidスマートフォン向けアプリを
Androidのタブレット上で動作するように改造していたら
動作中に「NetworkOnMainThreadException」が発生しました。

・・・なんだかわからなかったので調べたところ
こんな記事がありました。
RainbowDevilsLandの記事より
NetworkOnMainThreadException
内容によると

携帯向けのAndroidアプリをAndroid3.0のタブレットで動作させると、NetworkOnMainThreadExceptionが発生している箇所があった。
どうもAndroid3.0からメインスレッド(UIスレッド)から通信を行うとNetworkOnMainThreadExceptionが発生するようになったようだ。

まさにそのとおりです。

【これを回避する方法】・・・(かもしれない)
エラーの文言通り、メインスレッド上に通信処理を記述しなければOKか・・・と思い
(まぁ、もともとメインスレッドに処理書いてた私が悪いっすね)
通信処理を外に出したユーティリティクラスを作ってそれを呼ぶようにしました。



あ、なんとか動いた。(NetworkOnMainThreadExceptionが出ない)

・・・そんなことか・・・
チャンチャン♪

2011年8月12日

CodeIgniterのすすめ Active Recordクラス

投稿者:isc_blog

CodeIgniterについて何度かご紹介してきていますが
ここんとこSeasar2(Javaのフレームワーク。個人的にはJavaのフレームワークの中で一番好きかな。)っぽいなぁ~と思ったActive Recordクラスについて
ご紹介します。

Seasar2の中でもS2JDBCっていうSeasar2のO/Rマッパーで・・・
っていうか
まぁ、百聞は一見にしかず・・・ってことでこんなコードでDB検索を可能にしています。
[java]
List<Employee> results = jdbcManager.from(Employee.class)
.join("department")
.where("id in (? , ?)", 11, 22)
.orderBy("name")
.getResultList();
[/java]
これって実際のSQLは・・・・こんな感じ
[sql]
select T1_.ID, T1_.NAME, T1.DEPARTMENT_ID, T2_.ID, T2_.NAME
from EMPLOYEE T1_ left outer join DEPARTMENT T2_ on T1_.DEPARTMENT_ID = T2_.ID
where T1_.ID in (?, ?)
order by T1_.NAME desc
[/sql]
※SQL文内の「?」に 「11」「12」が入ってくる感じです。

これをCodeIgniterのActive Recordクラスで書くと・・・
[php]
$this->db->select(‘employee.id,employee.name,employee.department_id,department.id,department.name’);
$this->db->from(‘employee’);
$this->db->join(‘department’, ‘department.id = employee.id’,’left’);
$this->db->where_in(‘id’, array(’11’,’12’));
$this->db->order_by("employee.name", "desc");
$query = $this->db->get();
[/php]
こんな感じ(間違ってたらごめんなさい)
もしかしたらCodeIgniterの方が直感的かもしれない。

どちらももっと複雑なSQLの場合は直接SQL文節をかけちゃう
「S2JDBC」
[java]
List<Employee> results = (List<Employee>) entityManager.createQuery(
"select e from Employee e left join fetch e.department" +
" where e.id in (?1, ?2) order by e.name")
.setParameter(1, 11)
.setParameter(2, 22)
.getResultList();
[/java]

「CodeIgniter」
[php]
$this->db->select(‘(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4′) AS amount_paid’, FALSE);
$query = $this->db->get(‘mytable’);
[/php]

フレームワークを導入したせいでガチガチでどうしようもなくなる(またはフレームワークのせいでSQL構文を合わせないといけない・・・)というフレームワークではつかれるので、こういうところは柔軟であってほしい。

やはりいいフレームワークだと思います。

久々に書いたけどS2JDBCも強力だなぁ~
Java書きたくなってきたー
※Androidは書いてるか・・・

2011年8月2日

Android ImageViewにWeb上の画像を表示・・・その後

投稿者:isc_blog

先日、Android ImageViewにウェブ上の画像表示という記事の中で書いた
Web上の画像をImageViewで表示する方法でしたが・・・

実は「UrlImageView」なるものを作成している方がいらっしゃいまして、そちらの方が便利!なのでご紹介します。

CaddieDroid
ImageViewをカスタマイズして、Webの画像を表示できるようにしました

上記の記事の中で紹介されているのですがすごく助かりました。

このソースに関しては

AndroidのImageViewで、インターネット上にある画像を表示する独自ImageView。
MIT Licenseで、自由にお使いください。ソースの書き換えて等も自由にしてください。

とのことですのでMIT Licenseを理解の上で利用させていただきましょう!

GitHubで全ソース+サンプルコードをダウンロード出来るそうです。
https://github.com/sharakova/UrlImageView

2011年6月24日

Android開発・・・ScrollViewでつまずいた今日

投稿者:isc_blog

Android開発でScrollViewについて悩んだことメモ

どうもScrollViewって使いにくい!っていう話はおいといて事象と解決策をメモしておきます。

画面上でスクロールさせたいのでScrollView使ったんですが
おもむろに使ったら・・・

ERROR/AndroidRuntime(17331): Caused by: java.lang.IllegalStateException: ScrollView can host only one direct child

みたいなエラーが出てしまいました。
で、いつものように調べました・・・

Androidでスクロールバーを表示する方法

こちらのブログに書いてありました。

ScrollViewには子要素は一個にしろ・・・と

まぁ、エラーを解読すればそのまんまでした・・・

で、こちらのブログ通りを作って要素を囲みました。
LinearLayout自体がスクロール可能な方がいい気がしますね。

2011年6月23日

Android ImageViewにウェブ上の画像表示

投稿者:isc_blog

Android開発しているとAndroid開発ネタばかりに偏りがちです・・・
が、仕方ないっス。
今日のAndroidネタは・・・

Androidでウェブ上の画像を表示する必要があり
ImageViewを使用して
ImageViewのメソッド setImageURI でURI指定すればいいのかな・・・と思い

[java]


ImageView iv = (ImageView) findViewById(R.id.imageview);
Uri.Builder ub = new Uri.Builder();
ub.scheme("http");
ub.authority("~ドメイン~");
ub.path("images/image.jpg");
iv.setImageURI(ub.build());


[/java]

と記述したが・・・全然表示されない・・・

調べたところ、setImageURI ではうまくいかないという記事を発見。(下記URL)

iRSSの日記|ImageViewにhttp経由の画像を表示する方法

記事にもあるように Drawable を生成して
ImageView の setImageDrawable(Drawable drawable) にセットしてあげる必要があるらしい。

で・・・こんなふうにしました。

[java]



InputStream is = (InputStream) this.fetch(ub.build().toString());
Drawable drawable = Drawable.createFromStream(is, "");
is.close();



[/java]
Android SDK 逆引きハンドブック を参考にしました。
※Exceptionの処理は適宜入れてください。

こんな感じでDrawableを生成したら・・・

表示されました!!

※ImageViewあたりのソース(最終的)
[java]


ImageView iv = (ImageView) findViewById(R.id.imageview);
Uri.Builder ub = new Uri.Builder();
ub.scheme("http");
ub.authority("~ドメイン~");
ub.path("images/image.jpg");
InputStream is = (InputStream) this.fetch(ub.build().toString());
Drawable drawable = Drawable.createFromStream(is, "");
is.close();
iv.setImageDrawable(drawable);


[/java]

2011年6月20日

GAEのcron設定(覚え書き)

投稿者:isc_blog

Java 用の cron を使用したスケジュール タスク

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/recache</url>
    <description>Repopulate the cache every 2 minutes</description>
    <schedule>every 2 minutes</schedule>
  </cron>
  <cron>
    <url>/weeklyreport</url>
    <description>Mail out a weekly report</description>
    <schedule>every monday of month 08:30</schedule>
    <timezone>America/New_York</timezone>
  </cron>
</cronentries>

シンプルなスケジュール指定方法(<schedule>~</schedule>内の記述
every 5 minutes
every 12 hours
2nd,third mon,wed,thu of march 17:00
every monday of month 09:00
1st monday of sep,oct,nov 17:00

さらに詳細な分岐設定もOK・・・
(“every”|ordinal) (days) “of” (monthspec) (time)
など・・・
あとはリンク先を見るべしw

2011年5月5日

Java で逆ピラミッドを作る

投稿者:isc_blog

Java で逆ピラミッドを作る

Yahoo!知恵袋で回答したものをこちらにも・・・
なにかの宿題なのかな・・・

以下、[Pyramid.java]で保存してください。
———————————–
public class Pyramid{
public static void main(String[] args){
// ピラミッド階数
int i = 10;
for(int j = 0; j <= i; j++){ for (int k = i - j; k > 0; k–) {
System.out.print(“*”);
}
System.out.println();
}
}
}
——————————

コマンドプロンプトでファイルを保存したディレクトリに移動して
javac Pyramid.java
※JAVA_HOMEパス及びクラスパスを通してある前提です。

java Pyramid
で実行・・・

—–
実行後

**********
*********
********
*******
******
*****
****
***
**
*

こんな感じ。

2011年4月30日

javaで未来を感じるSWT画面を速攻作るだけのクラス

投稿者:isc_blog

まずは、SWTライブラリを取得します。

SWT は以下のサイトからダウンロードできます。

Eclipse.org
http://www.eclipse.org/

そして Eclipse上で動作する前提で・・・

↑のようにビルド・パスを設定してください。

 

その後

以下をコピペして「SWTWindow.java」というファイル名にしてください。

[java]
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

public class SWTWindow {

// シェル
private Shell sShell = null;

// ボタン
private Button button = null;

// タイトル
private static final String title = &quot;SWT Window&quot;;

/**
* ウィンドウオープン
* @param args
*/
public static void main(String[] args) {
// ディスプレイ設定
Display display = Display.getDefault();
// static なメソッドから呼ぶために自クラスをインスタンス化
SWTWindow thisClass = new SWTWindow();
// シェル作成
thisClass.createSShell();
// シェルオープン
thisClass.sShell.open();
// シェルが生存している間待つよ
while (!thisClass.sShell.isDisposed()) {
//
if (!display.readAndDispatch())
// ディスプレイスリープ
display.sleep();
}
display.dispose();
}

/**
* シェル作成
*/
private void createSShell() {
// シェルインスタンス生成
sShell = new Shell();
// レイアウト=グリッドレイアウト設定
GridLayout gridLayout = new GridLayout();
// グリッドデータインスタンス生成
GridData gridData = new GridData();
// シェルにタイトル設定
sShell.setText(title);
// シェルにレイアウト設定
sShell.setLayout(gridLayout);
// ボタンインスタンス生成
button = new Button(sShell, SWT.NONE);
// ボタンのキャプションを「Close」に設定
button.setText(&quot;Close&quot;);
// ボタンをグリッドデータに設定
button.setLayoutData(gridData);
// シェルの画面サイズを 500px×500px に設定
sShell.setSize(new Point(500, 500));
// ボタンにリスナー設定
button.addSelectionListener(new SelectionAdapter() {
// 選択された際のイベント
public void widgetSelected(SelectionEvent e) {
doExit();
}
});
// シェルにリスナー設定
sShell.addShellListener(new ShellAdapter() {
// 閉じられたときのイベント
public void shellClosed(ShellEvent e) {
}
});
}

// ウィンドウ閉じるメソッド
private boolean doExit() {
// メッセージボックス
MessageBox mb = new MessageBox(sShell, SWT.ICON_QUESTION | SWT.YES
| SWT.NO);
// メッセージボックスのタイトル
mb.setText(&quot;Closing OK?&quot;);
// メッセージボックスに表示されるメッセージ
mb.setMessage(&quot;閉じますよ。OKですかいな?&quot;);
// メッセージボックスオープン
int state = mb.open();
// メッセージボックスで「OK」以外押しても無反応
if (state != SWT.YES) {
return false;
}
// シェル閉じる
sShell.close();
// シェル開放(明示的にやる必要がある)
sShell.dispose();
// 処理終了
return true;
}
}
[/java]

で、実行すると未来を感じるウィンドウが表示されます。

表示されておしまいです。

2011年4月26日