【JAVA】AsyncTaskのonPostExecute()にて,ちっとは楽にUIへ値をセットしたい
関連記事
- Oracleのライセンスモデル変更によりJavaのコストが急増する可能性 【2023年04月06日(木)】
- 【Log4j】ログ管理ソフトに欠陥、Amazonなど調査(21/12/14) 【2021年12月14日(火)】
- 「やばすぎる」 Javaライブラリ「Log4j」にゼロデイ脆弱性、任意のリモートコードを実行可能 【2021年12月10日(金)】
- 【#Java】Javaプロジェクトがコンパイル出来ん!アタフタアタフタ #Eclipse 【2020年10月30日(金)】
- 【#Java】無償利用は個人での開発・テスト・デモ目的のみに(19/4/18) 【2019年04月18日(木)】
Android3.0以降は,http通信をメインスレッドでやるのはご法度
ってことで,AsyncTaskの継承クラスを実装して,通信すべし
が,定石らしいけど,こやつ,UIの各部品に値をセットするのが,かなり面倒
onPostExecute()をオーバーライドして,その中でUIへアクセスしろって書いてあるんじゃが
これヘタすると,http通信の数×画面数分のクラスを準備しかねない事態
なんか妙案はないかねぇ...じゃったんじゃが
結果,動的メソッド機構を使えばいいんじゃね?に行き着いて,実装してみたら
上手くいったんで,ここにソースを書いておきまする
まず,AsyncTaskの継承クラス
public class BackgroudTask extends AsyncTask <Integer, Integer, Integer> { public Class<?> instance; public Object ParentObj; 略 ~~~~ 略 /** * バックグランド処理が完了し、UIスレッドに反映する */ @Override protected void onPostExecute(Integer result) { Class<?>[] c1 = new Class[2]; c1[0] = Object.class; c1[1] = String.class; try { Method meth =instance.getMethod("setUIData", c1); //呼び出すメソッド名と,メソッドに渡す引数の型をセット meth.invoke(instance.newInstance(), ParentObj, m_Str); //実際に呼び出す } catch (NoSuchMethodException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IllegalAccessException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (InvocationTargetException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (InstantiationException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } }この2つに,親UI側のクラス型と,親UIインスタンスをセット
public Class> instance;
public Object ParentObj;
オーバーライドしたonPostExecute()にて
親UI側に定義するパブリックメソッドsetUIData()を呼び出すカラクリを
引数に,ParentObjをセットするのが,ちょいとしたミソでごわす
親UIクラス側
task = new BackgroudTask(); task.instance = MainUI.class; //UI側のクラス型 task.ParentObj = this; //UIのインスタンス task.execute(1); 略 ~~~~ 略 public void setUIData(Object Parentobj, String st) //AsyncTaskのonPostExecute()内から呼び出されるメソッド { MainUI obj2 = (MainUI)Parentobj ; TextView textView = (TextView) obj2.findViewById(R.id.textView6); textView.setText(st); }task.instance = MainUI.class;
task.ParentObj = this;
にて,親の情報をセット
setUIData()には,大回りしてきた親のインスタンス(Parentobj)が渡ってくるんで
キャストしてやると
これで,UI側でイロイロできるはず
AsyncTaskの継承クラスは上手く作ると,1個で済みますわん
いつもの様にバグっていたらすまんこってす(爆
コメント
九州自動車道 トンネル内で大型トレーラーから出火 人吉~八代間で通行止め(24/7/26)
【#ご到着シリーズ】冷凍かしわ飯&冷凍かしわうどんセットに当選したモルモルモル
【#破局噴火】イエローストーンで大規模な水蒸気爆発が発生
暑すぎてダレてる.なんのやる気も起こらんドロドロドロ
【#Windows #CrowdStrike】セキュリティーソフト世界シェア1位があだ…ウィンドウズ障害、「過去最大規模」の見方も
3連休,らしい.これといって予定はない(爆
【#trump #shooting】トランプ暗殺未遂:トランプ氏 集会で発砲音「前大統領は無事」死者も
【#線状降水帯】九州北部山口県に線状降水帯発生予測情報発令(24/7/13)
【#落雷】今朝の雷,すごかったー 清武城かお隣のマンションに落雷したー共用部の電源落ちてるテレビが映らない!
【#彗星】紫金山アトラス彗星(C/2023 A3)がぶっ壊れた!今秋,見れると思ってたのにピエン