【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個で済みますわん
いつもの様にバグっていたらすまんこってす(爆

コメント
【クマ】クマによる人的被害、生活圏7割 環境省まとめ、出没は最多2万件
「ニュウハクシミ」紙を食べる害虫 生息19都道府県に拡大
文化の日な祭日らしい.文化的に休むもうず?
【#HTVX】新型宇宙輸送船HTV-X 油井さんがロボットアームでキャッチ
【冬】来週11℃予想とか出てきてる.秋があったのか,今年(25/10/23)
【ツル】出水平野に冬の訪れを告げるツル第一陣・今季初飛来 鹿児島(25/10/21)
都城でプロ野球・ロッテ1軍が春季キャンプ実施へ
山形で開催の映画祭 監督など国内外の参加者が“芋煮”味わう
連休なんで生駒高原でコスモスを愛でてきた
連休の中日ですの.天気は良くなる方向じゃげ