【JAVA】AsyncTaskのonPostExecute()にて,ちっとは楽にUIへ値をセットしたい
関連記事
- ぎんゆぅ~さんの更新頻度が落ちているときは仕事炎上中(爆 【2025年01月09日(木)】
- 仕事が納まった,のか?一応,拘束解除命令が出たモルモルモル 【2024年12月27日(金)】
- さすがに激務すぎ,ワロタ! 【2024年12月25日(水)】
- 今週もひたすらモノ書き #JAVA 祭りがまだまだ続く そろそろC#を書かせろー 【2024年12月04日(水)】
- 【#Kotlin】「ことりん」な実装依頼がキター 【2024年10月17日(木)】
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個で済みますわん
いつもの様にバグっていたらすまんこってす(爆
コメント
【#大相撲】 横綱 照ノ富士 引退の意向を固める
【#日向灘地震】割れ残り部が依然健在じゃし.怖いわなぁ
【#大地震】宮崎に大地震キタ━(゚∀゚)━!!(25/1/13)
【#大雪】宮崎市に降雪予報キター(25/1/11)
【#2025】あけおめ~ 2025年が始まったらしい...ドロドロドロ
2024年が終わりますなぁ 1年ありがとうございました
ついに宮崎市も氷点下気温キター(24/12/23)