質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

2177閲覧

AsyncTaskのonPostExecuteが呼ばれない

a.com

総合スコア907

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2021/12/26 05:42

編集2021/12/27 11:21

ボタンを押したらHTTPリクエストしてその結果をTextViewに表示するようにしたいのですが
doInBackgroundが実行されたあと、onPostExecuteが呼ばれません。
MainActivityのonClickからAsyncTaskのサブクラスのexecuteをよんでいるだけなのですが、、、

単に別スレッドでリクエスト投げて結果をコールバックで受け取れればよいだけのですが
AsyncTaskは使う必要はないのしょうか?

コードです

java

1 class RequestTask extends AsyncTask<Void, Void, String> { 2 @Override 3 protected void onPreExecute() { 4 } 5 @Override 6 protected String doInBackground(Void... arg0) { 7 return response_data; 8 } 9 @Override 10 protected void onPostExecute(String result) { 11 showResponseView(result); 12 } 13 } 14これをMainActivityのonClickからよんでるだけです 15 public void onClick(View v) { 16 if (v == null) { 17 return; 18 } 19 switch (v.getId()) { 20 case R.id.button: 21 new RequestTask().execute();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/12/26 05:53

AsyncTask は非推奨になりましたが、使えることは使えるはずです。 onPostExecute が呼ばれない件は、ソースを貼ってくれないと分かりません。
jimbe

2021/12/26 06:46

> AsyncTaskは使う必要はないのしょうか 必要性を判断できるのはご本人だけです。
a.com

2021/12/27 11:21

なるほど非推奨なのですね!ありがとうございます。
jimbe

2021/12/27 11:30

コードがご提示されましたが、大分省略されているようで、 doInBackground が終了しているのをどう確認されたのかも分かりません。 doInBackground が終了していること、そして onPostExecute が呼ばれていないことをどう確認されたのでしょうか。
a.com

2021/12/27 13:05

デバッグでdoInBackgroundのreturnまで確認しました
a.com

2021/12/27 13:06

onPostExecuteにブレークポイント貼っていたのですが呼ばれませんでした。
jimbe

2021/12/27 13:51

> onPostExecuteにブレークポイント貼っていたのですが呼ばれませんでした つまり「 onPostExecute で止まらなかった」ので呼ばれていないと判断されたということでしょうか。
a.com

2021/12/27 13:55

もちろん、textviewにテキストを設定するようなメソッド呼び出しもしていましたが何も反応なかったので
a.com

2021/12/28 14:24

hoshi-takanori様 jimbe様 原因が判明しました。実は例外が発生していました。 大変申し訳ございません。
jimbe

2021/12/28 16:03

解決すればとりあえずは OK ですが、お時間ありましたら、どのようにブレークポイントを設定して実行した場合に、どこで例外が発生すると doInBackground の return まで行っても onPostExecute が呼ばれないのか、同じように onPostExecute が実行されないことで teratail を見に来るかもしれない後日の人の為に、情報を回答として載せて置いて頂けませんでしょうか。
guest

回答2

0

原因としてはdoInBackground内で捕捉できない例外が発生していたです。ソケットの読み取り方法に不具合があり、ワーカースレッドが落ちたのかと思います。

投稿2021/12/28 23:53

a.com

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こちらでは AndroidStudio の EmptyActivity から新しくプロジェクトを作って以下のコードで実験しても、 RequestTask.onPostExecute が実行されない様子は無く、 "response_data" が表示されました。

MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.os.*; 4import android.widget.*; 5 6public class MainActivity extends AppCompatActivity { 7 private TextView textView; 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 Button button = findViewById(R.id.button); 15 button.setOnClickListener(view -> new RequestTask().execute()); 16 17 textView = findViewById(R.id.textView); 18 } 19 20 class RequestTask extends AsyncTask<Void, Void, String> { 21 @Override 22 protected void onPreExecute() { 23 } 24 @Override 25 protected String doInBackground(Void... arg0) { 26 return "response_data"; 27 } 28 @Override 29 protected void onPostExecute(String result) { 30 textView.setText(result); 31 } 32 } 33}

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <Button 11 android:id="@+id/button" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="START" 15 app:layout_constraintBottom_toTopOf="@id/textView" 16 app:layout_constraintLeft_toLeftOf="parent" 17 app:layout_constraintRight_toRightOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 <TextView 20 android:id="@+id/textView" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:text="Hello World!" 24 app:layout_constraintBottom_toBottomOf="parent" 25 app:layout_constraintLeft_toLeftOf="parent" 26 app:layout_constraintRight_toRightOf="parent" 27 app:layout_constraintTop_toBottomOf="@id/button" /> 28 29</androidx.constraintlayout.widget.ConstraintLayout>

投稿2021/12/27 14:12

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問