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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Q&A

解決済

1回答

1727閲覧

[Android] asynctaskをonCreateメソッド以外で実行する方法

aiueo1

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

0グッド

0クリップ

投稿2018/08/27 03:55

編集2018/08/28 07:05

###onCreateメソッドの中だけでしかasynctaskが実行されません

onCreateメソッドではasynctaskが動くのですが、スピナーやボタンを押した時は動いてくれません。

この問題の解決方法がわかりません。

onCreateメソッド以外ではasynctaskを呼び出すことはできないのですか。それとも、呼び出し方が間違っているのですか。

発生している問題・エラーメッセージ

スピナーをクリックしたときのメッセージ W/System.err: java.lang.IllegalStateException: Observer android.widget.AbsListView$AdapterDataSetObserver@46ca7ff was not registered. at android.database.Observable.unregisterObserver(Observable.java:69) 08-27 11:20:30.856 11772-11814/com.example.sample.test W/System.err: at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42) at android.widget.ListView.setAdapter(ListView.java:472) at com.example.sample.test.MainActivity$AsyncTaskA.doInBackground(MainActivity.java:307) at com.example.sample.test.MainActivity$AsyncTaskA.doInBackground(MainActivity.java:256) at android.os.AsyncTask$2.call(AsyncTask.java:305) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) ボタンをクリックしたときのメッセージ W/System.err: java.lang.IllegalStateException: Observer android.widget.AbsListView$AdapterDataSetObserver@46ca7ff was not registered. 08-27 11:21:53.449 11772-11825/com.example.sample.test W/System.err: at android.database.Observable.unregisterObserver(Observable.java:69) at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42) at android.widget.ListView.setAdapter(ListView.java:472) 08-27 11:21:53.450 11772-11825/com.example.sample.test W/System.err: at com.example.sample.test.MainActivity$AsyncTaskA.doInBackground(MainActivity.java:307) at com.example.sample.test.MainActivity$AsyncTaskA.doInBackground(MainActivity.java:256) at android.os.AsyncTask$2.call(AsyncTask.java:305) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 08-27 11:21:53.451 11772-11825/com.example.sample.test W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761)

該当のソースコード

/*スピナーをクリックしたときの処理*/ private class selectSpinner implements AdapterView.OnItemSelectedListener { public void onItemSelected(AdapterView<?> parent, View arg1, int arg2, long arg3) { // 選択されているアイテムのIndexを取得 int idx = spinner.getSelectedItemPosition(); //IndexによってAsyncTaskの処理を変えたい if(idx == 0) { new AsyncTaskA().execute("args as doInBackground"); }else { new AsyncTaskB().execute("args as doInBackground"); } } public void onNothingSelected(AdapterView<?> parent) { } } /*通信がうまくいかなかったときにもう一度通信するボタン*/ private class retryListener implements View.OnClickListener{ @Override public void onClick(View view){ // 選択されているアイテムのIndexを取得 int idx = spinner.getSelectedItemPosition(); //IndexによってAsyncTaskの処理を変えたい if(idx == 0) { new AsyncTaskA().execute("args as doInBackground"); }else { new AsyncTaskB().execute("args as doInBackground"); } } }

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーログを見る限りだと、AsyncTaskの doInBackground メソッドの中でListViewのsetAdapterメソッドを呼んでいるので、これが原因かと思います。Androidではメインスレッド以外のスレッドからUIに関する操作をしてはいけません。

非同期処理の結果を元にListViewの表示を更新したいのなら、AsyncTaskの onPostExecute メソッドの中で行うように修正してみてください。

投稿2018/08/29 11:29

kakajika

総合スコア3131

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問