Android用ブラウザ制作

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Android用ブラウザ制作

投稿記事 by Dixq (管理人) » 13年前

JAVAとAndroidを学び始めて2ヶ月あまり。
冬休みの13日間でブラウザを作ってAndroidの知識を深めようと奮闘中です。
現在一応一通り使えるブラウザができました。
α版ですが,インストールしてみたい物好きな方はどうぞ!

[アプリ]
http://dixq.sakura.ne.jp/Android/bin/12 ... rowser.apk
(マーケット以外からアプリをインストールするときは, 設定 > アプリケーション > 不明な提供元 にチェックを入れると可能になります)

[ソースコード]
http://dixq.sakura.ne.jp/Android/src/12.01.03.zip

ソースコードは試行錯誤の末のコードで,はっきり言ってぐっちゃぐちゃなので,参考にしないで下さい(^^;

簡単にアプリの説明をすると・・・

普通にブラウザとして使えます。
デフォルトではgoogleのトップページがホームになっています。

画像

「★」ボタンを押すか,画面右端から左へスライドするジェスチャでブックマークが開きます。

画像

ブックマークの一番上をタップすると,現在のページが登録されます。
タップするとウェブ画面がキャプチャされ,サムネイルとなります。

画像

URL表示欄はURL入力欄兼,検索バーです。

戻るボタンはOS標準の戻るボタン,メニューボタンでホームの設定などが出来ます。

まだ不具合沢山あるのでご了承ください・・w
ただ,パーミッションがinternetしかないので,バグのせいで何かの大事なデータを消すなんてことは無いです。
最後に編集したユーザー Dixq (管理人) on 2012年1月04日(水) 00:01 [ 編集 2 回目 ]

アバター
tana
記事: 33
登録日時: 14年前

Re: Android用ブラウザ制作

投稿記事 by tana » 13年前

使ってみましたが、ユニークですねw
今後の改良に期待してます

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Android用ブラウザ制作

投稿記事 by Dixq (管理人) » 13年前

>tanaさん

おぉ,ありがとうございます!
まだタブが無かったり・・沢山必要なものはありますね^^;

アバター
沖 滉均
記事: 237
登録日時: 14年前

Re: Android用ブラウザ制作

投稿記事 by 沖 滉均 » 13年前

冬休みが13日間っていうのがまず…
まぁ、それはさておきAndroid携帯持ってないから試せないや(;´Д`)

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: Android用ブラウザ制作

投稿記事 by bitter_fox » 13年前

幾つか気になったことを・・・

CODE:

public class Def { 
    public final static String TAG = new String("Qrowser");
    public final static String INTENT_TAG = new String("SELECTED_ITEM");
    public final static String sINTENT_EXTRA_TITLE = new String("ExTitle");
    public final static String sINTENT_EXTRA_URL   = new String("ExUrl");
}
new String("...")は単に"..."でよくないですか?
http://www.ne.jp/asahi/hishidama/home/t ... tml#String

BookMarkBindDataのコンストラクタは次のように書いた方が美しいかと

CODE:

public class BookMarkBindData {
	public String mTitle;
	public String mUrl;
	public Bitmap mBmp;

	public BookMarkBindData() {
		this(null, null, null); // フィールドは初期値(オブジェクト型ならnull)で初期化されるのでこの行は無くても良い
	}

	public BookMarkBindData(String title, String url) {
		this(title, url, null);
	}

	public BookMarkBindData(String title, String url, Bitmap bmp) {
		mTitle = title;
		mUrl = url;
		mBmp = bmp;
	}
}
http://www.ne.jp/asahi/hishidama/home/t ... ault_value

自分ならこう書きます。[追記]

CODE:

public class BookMarkBindData {
	public String title;
	public String url;
	public Bitmap bmp;

	public BookMarkBindData() {
		this(null, null, null); // フィールドは初期値(オブジェクト型ならnull)で初期化されるのでこの行は無くても良い
	}

	public BookMarkBindData(String title, String url) {
		this(title, url, null);
	}

	public BookMarkBindData(String title, String url, Bitmap bmp) {
		this.title = title;
		this.url = url;
		this.bmp = bmp;
	}
}

CODE:

public class Share {
	public static Activity mActivity = null;
}
なんか、グローバルで怖いです・・・

CODE:

	public void finalize(){	//デストラクタ
		if( mBmp != null ){
//			mBmp.recycle();	//ここでrecycleすると落ちる!しかししないとメモリリークする・・
		}
	}

	protected void finalize() {
		//ここでメモリリークが起きる
		// これ以外にセットしたBmpを解放する方法が無いか?
/*	//これでも落ちる
		imageView.setImageDrawable(null);
		if (ImageViewBmp != null) {
			Log.d(Def.TAG, "ImageViewBmp.recycle()");
			ImageViewBmp.recycle();
		}
*/
	}
android developers さんが書きました: public void recycle ()
Since: API Level 1

Free the native object associated with this bitmap, and clear the reference to the pixel data. This will not free the pixel data synchronously; it simply allows it to be garbage collected if there are no other references. The bitmap is marked as "dead", meaning it will throw an exception if getPixels() or setPixels() is called, and will draw nothing. This operation cannot be reversed, so it should only be called if you are sure there are no further uses for the bitmap. This is an advanced call, and normally need not be called, since the normal GC process will free up this memory when there are no more references to this bitmap.
このビットマップに関連付けされたネイティブなオブジェクトを解放して、ピクセルデータへの参照を取り除きます。
これは同調してピクセルデータを解放することは無いでしょう。単に他に参照が無かった時にGCが起きることを許可します。
もしgetPixels()やsetPixels()が呼ばれたりすると例外を投げて、何も描画せずに、ビットマップが「死んでいる」ことを目立たせます。
このオペレーションを取り消すことはできません、なのでビットマップの用途がこれ以上ないと確信できる時だけこのメソッドを呼ぶべきです。
これは高度な呼び出しで、普通はこのビットマップへの参照が無くなるとGCがこのメモリを解放するので、通常は呼ばれる必要がありません。
落ちるのはmBmpやImageViewBmpが指すオブジェクトがまだ残っていてそれが実際に描画されているせいじゃないでしょうか。
どれぐらいのメモリリークが起きているのかが分からないのでアレですが、GCが回収するようになるまでほっといたらどうでしょう?

あと命名規則が・・・そのJavaじゃないですw
最後に編集したユーザー bitter_fox on 2012年1月04日(水) 11:48 [ 編集 1 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Android用ブラウザ制作

投稿記事 by Dixq (管理人) » 13年前

>沖さん

今年は休みがいい感じに並んでるので,1/5,6有給取るだけでそうなるのですよb

Androidは最近1万位のもあるし,興味があれば是非w

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Android用ブラウザ制作

投稿記事 by Dixq (管理人) » 13年前

>狐先生

先生にこんなに詳しく見て頂けるとは/(^o^)\
JAVAについては動けばいいやな感じなので,まともに学んでません・・w
命名規則もなんでこんなに揺れてるの?!って感じなので,次回はjavaのスタイルに統一します!

> なんか、グローバルで怖いです・・・

えぇ,それは不適切ですよね・・w
ただ,Toastなどどこのクラスからでも使用したいメソッドなのに,アクティブなアクティビティのインスタンスが無いと使用できないものもあり,とりあえずこんな感じになってました。
でも調べてみたら,アクティブなアクティビティのContextを取得するAPIがあったので,これは必要ないですね。

> new String("...")は単に"..."でよくないですか?

素晴らしい。いつもめんどくさいな~と思ってましたw

> 落ちるのはmBmpやImageViewBmpが指すオブジェクトがまだ残っていてそれが実際に描画されているせいじゃないでしょうか。
> どれぐらいのメモリリークが起きているのかが分からないのでアレですが、GCが回収するようになるまでほっといたらどうでしょう?

そうなんですよね。
ただ,自動セットされたBmpはほっといても解放されるけど,Bitmap.createBitmapで作ったビットマップは自分でrecycleする必要があると思ってました。
違うのかな・・"out of memory"が表示されたのでそうかと思ってましたがよく確認しておきます。

> BookMarkBindDataのコンストラクタは次のように書いた方が美しいかと

こう書くと,後から変数追加した時に全部に引数を追加する必要があって面倒ってことはないです?

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: Android用ブラウザ制作

投稿記事 by bitter_fox » 13年前

Dixq (管理人) さんが書きました: ただ,自動セットされたBmpはほっといても解放されるけど,Bitmap.createBitmapで作ったビットマップは自分でrecycleする必要があると思ってました。
違うのかな・・"out of memory"が表示されたのでそうかと思ってましたがよく確認しておきます。
一回recycleを呼んで例外を出しておいて、原因を突き止めたほうがよさそうですね。
Dixq (管理人) さんが書きました: > BookMarkBindDataのコンストラクタは次のように書いた方が美しいかと

こう書くと,後から変数追加した時に全部に引数を追加する必要があって面倒ってことはないです?
確かに引数を追加していく必要がありますけど、処理を変更する必要があるときと比べたら労力は少ないと思います。
initとか言うメソッドを一つだけ作っておいてそこにまとめればもし引数を追加し忘れていてもコンパイルエラーになってくれますし。(処理の変更漏れはコンパイルじゃ分からないですよね)
オフトピック
同じ値を設定するんだったら実は一か所だけ変更すれば済むけど、複雑になるからあんまり・・・

CODE:

public class BookMarkBindData {
    public String title;
    public String url;
    public Bitmap bmp;
    public Object obj;
 
    public BookMarkBindData() {
        this(null, null, null); // フィールドは初期値(オブジェクト型ならnull)で初期化されるのでこの行は無くても良い
    }
 
    public BookMarkBindData(String title, String url) {
        this(title, url, null);
    }

    public BookMarkBindData(String title, String url Bitmap bmp)
    {
        this(title, url, null, null);
    }
 
    public BookMarkBindData(String title, String url, Bitmap bmp, Object obj) {
        this.title = title;
        this.url = url;
        this.bmp = bmp;
        this.obj = obj;
    }
}