【JAVA】AsyncTaskのonPostExecute()にて,ちっとは楽にUIへ値をセットしたい
関連記事
- 【#JAVA】月曜朝からドカンドカン,モノ書きしてるぞー すでに1週間分のエネルギーを使い切った(爆 【2024年10月07日(月)】
- 【#JAVA】もう1週間オワタ!ずっとJAVAってた!明日もちょいと仕事しまする 【2024年10月04日(金)】
- 【#JAVA】たった1行の不具合対策に8時間もかかってしもうた 【2024年09月17日(火)】
- Oracleのライセンスモデル変更によりJavaのコストが急増する可能性 【2023年04月06日(木)】
- 【Log4j】ログ管理ソフトに欠陥、Amazonなど調査(21/12/14) 【2021年12月14日(火)】
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個で済みますわん
いつもの様にバグっていたらすまんこってす(爆
コメント
生駒高原へコスモスを見物しに行ってみた
急激に寒くなってキター 晩秋がやってきた!
【#諸塚村】連休初日のBBQの模様なぞをアップしてみる
冷房なしで日中過ごすの,いつ以来よっ!?優しい涼しさが心地よい
【#異星人 発見!】異星人から謎の暗号メールを受け取った!解読不能ヤバス【シレペヒキク】
タッパーウェアが破産申請を計画、事業てこ入れ策つまずく-関係者
電子レンジが不調になったヤバス
【#地震】霧島山で有感地震 生駒高原のあたりか?(24/9/6)
奄美大島のマングース 環境省が根絶宣言