23
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

titaniumで作ったアプリがメモリリークするときに行った対処法3つ

Posted at

カメラを起動してバーコードを撮影し、そこから読み取ったISBNコードを使ってAmazonAPIを叩いたり何だりするアプリを作ったものの、やたらと落ちる。
そんなときに行った対処法です。
###HTTP通信
APIを叩くときなど使用頻度の高いHTTP通信ですが、[Titanium.Network.HTTPClient] (http://docs.appcelerator.com/titanium/latest/#!/api/Titanium.Network.HTTPClient)を使ったときにメモリリークが多発。
__原因:__単純に通信後メモリ解放が出来ていない
__解決:__通信終了後にonloadなどのコールバックメソッドにnullを渡してあげる
ということで、以下のように実装しました。

var client =  Ti.Network.createHTTPClient({
  onload : function(e) {
  /* 
   * 無事レスポンスが返ってきたときの処理
   * ex) nextScreen関数に返ってきたテキストを渡す
   */
  nextScreen(this.responseText);

  /* nullを渡してコールバックメソッドの解放 */
  client.onreadystatechange = null;
  client.onload = null;
  /* HTTPClient自身にも */
  client = null;
 },
 onerror : function(e) {
  /* エラー時のステータス出力 */
  Ti.API.info('error: ' + e.source.status);

  /* nullを渡してコールバックメソッドの解放 */
  client.onreadystatechange = null;
  client.onerror = null;
  /* HTTPClient自身にも */
  client = null;
 },
 /* タイムアウト設定(1ミリ秒) */
 timeout: 1000
});

/* ついでにロード画面 */
client.onreadystatechange = function() {
 if (this.readyState == 2) {
  $.loadImage.backgroundImage = "/img/画像ファイル";
 }
};

参考

EventListener

次に取りかかったのがEventListenerの見直し。
イベントリスナーを追加した場合、イベント終了時にイベントを削除する必要があるとのこと。
__原因:__イベントがずっと生きている
__解決:__用の済んだイベントを削除
ダイアログを例にとると、このように実装しました。

var arr = ["first", "secont", "third"];
var dialog = Titanium.UI.createOptionDialog();
 /* ダイアログのタイトルとオプション(選択肢)をセット */
 dialog.setTitle('ダイアログタイトル');
 dialog.setOptions(arr);
 
 /* オプションが選択されたときの処理 */
 dialog.addEventListener('click', function(event) {
  number = event.index;
  /* イベントリスナーの削除 */
  dialog.removeEventListener("click", arguments.callee);
 });

参考

画面遷移

画面遷移というか、結果として画面遷移に関係する形で解決したもの。
__原因:__ISBN読み込む→必要な情報取得→画面遷移&表示 の流れが早過ぎて忙しくなった
__解決:__余計な処理を間に挟む
画面遷移時に0.5秒のインターバルを設けました。

function openAndClose(controller){
 /* 0.5秒経過したら次の画面に遷移し、今の画面を閉じる */
 setTimeout(function(){
  nextScreen.open();
  $.Screen.close();
 }, 500);
}

と、書いたもののfireEvent使えば余計な処理書かずに解決出来るらしいので、今度実装してみようかと思います。

23
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?