Androidでアプリに埋め込む配布用のSDKを作っていて、メインアプリになるべく影響ない作りにしたいと思って開発しており、ネックになった部分を整理したいのでまとめも!
(javaはじめたばっかりなので、なんでもご指摘くださいm(_ _;)m)
上記の通り、メインアプリに影響をなるべくなくすために何をしたらいいか考えたみた結果、
SDKの処理は非同期でやることにした。 (jarファイルで配布する予定)
今回はUIの操作も必要なので、方法として2点あるようだ・・・(かな?
HandlerでThreadを扱う方法とAsyncTaskを使う方法があるようで。
AndroidではUIの処理はシングルスレッドで、別タスクから処理は、そのシングルスレッドにジョブ登録するように利用する必要があるとの事。
AsyncTaskを使う場合は、メインのシングルスレッドにジョブを投げるよう意識する必要はないみたいですが。
■HandlerでUIスレッド(シングルスレッド)にジョブをpostするパターン
下記記事を参考にさせていただきました!ありがとうございます!
http://pentan.info/android/app/handler.html
http://www.adamrocker.com/blog/261/what-is-the-handler-in-android.html
UIスレッド操作はメインのスレッド以外から直接操作はできないので、
Handlerを使って、メインスレッドにタスクとしてpostしてあげる。
というのが必要との事。
Handler h= new Handler();
h.post(new Runnable() {
@Override
public void run() {
textView.setText("helloworld!"); //UI操作OK!
}
});
また、操作方法にはpostDelayedなどを使って一定時間ごとの処理も可能。
■AsyncTaskを使うパターン
参考にさせていただいたサイト!ありがとうございます!
http://android.keicode.com/basics/async-asynctask.php
http://labs.techfirm.co.jp/android/cho/1079
http://wikiwiki.jp/android/?AsyncTask%A4%C7%A5%D0%A5%C3%A5%AF%A5%B0%A5%E9%A5%A6%A5%F3%A5%C9%BD%E8%CD%FD%A4%F2%B9%D4%A4%A6
new MyAsyncAppTask().execute(api_key);
class MyAsyncTask extends AsyncTask<String, Integer, String[]>{ //
@Override
protected void onPreExecute() {
//準備処理を書く
}
@Override
protected void onProgressUpdate(Integer... values) {
//進捗状況
}
@Override
protected void onCancelled() {
//キャンセル
}
@Override
protected String[] doInBackground(String... api_key) {
//処理を書く※注意ここではUI処理はしない
return strArr;
}
@Override
protected void onPostExecute(String[] str) {
//処理完了時実行、doInBackgroundの戻り値など使って処理もできる。(UI処理も)
}
}
・ extends AsyncTask<型, 型, 型>
1つ目の型 = excute()の引数の型
2つ目の型 = onProgressUpdateの引数の型
3つ目の型 = doInBackgroundの引数の型
・onPostExecuteの引数には「…」はいれない。
せっかく調べたので、メモ。