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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

4949閲覧

android アプリ作成

ssa

総合スコア13

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2015/10/13 14:54

編集2015/10/14 04:41

android studioを使ってandroidアプリ開発の勉強をしているものです。
本に書いてあるプログラムを見ながら勉強しているのですが、AsyncTaskのdoInBackgroundメソッド内でgetTag();を使っているのでその通りに記述してみると、Method getTag must be called from the UI threadという警告が出ます。
UIスレッドでしか使えないよ、というような警告であると解釈したのですが、本の内容が間違っているのでしょうか。それとも何か別に原因があるのでしょうか。

ImageLoaderTask.java
Webから画像の読み込みを行うクラスです。

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.widget.ImageView;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;

import java.io.IOException;

public class ImageLoaderTask extends AsyncTask<ImageView, Void, Bitmap> {
private static final String USER_AGENT = "WeatherForecasts Sample";

private final Context context; Exception exception; ImageView imageView; public ImageLoaderTask(Context context) { this.context = context; } @Override protected Bitmap doInBackground(ImageView... params) { imageView = params[0]; String url = (String) imageView.getTag(); /*ここに警告が出る*/ try { return getImage(context, url); } catch (IOException e) { exception = e; } return null; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (bitmap != null) { imageView.setImageBitmap(bitmap); } } private static Bitmap getImage(Context context, String url) throws IOException { AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT, context); HttpGet get = new HttpGet(url); try { HttpResponse response = client.execute(get); return BitmapFactory.decodeStream(response.getEntity().getContent()); } finally { client.close(); } }

}

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

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

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

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

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

swordone

2015/10/13 14:57

それだけではなんとも言えないので,コードを載せてください.
guest

回答1

0

ベストアンサー

こちらの環境でも再現されました.imageView.getTag()で
Method getTag must be called from the UI thread, currently inferred thread is worker
と書かれていますね.
低いAPIレベルでは呼べるのかもしれません.参照されている書籍は古いものではないでしょうか.
AsyncTaskには様々な書き方があり一概にいえませんが,最も単純な解決案として
onPreExecute()をOverrideし,その中で,String urlをgetTag()しておくことができるでしょう.

すべてコンストラクタで渡して下のようにしてもよいでしょう.

Java

1class ImageLoaderTask extends AsyncTask<Void, Void, Bitmap> { 2 private static final String USER_AGENT = "WeatherForecasts Sample"; 3 4 private final Context context; 5 6 private final ImageView imageView; 7 private final String url; 8 9 public ImageLoaderTask(Context context, ImageView imageView, String url) { 10 this.context = context; 11 this.imageView = imageView; 12 this.url = url; 13 } 14 15 @Override 16 protected Bitmap doInBackground(Void... params) { 17 try { 18 return getImage(context, url); 19 } catch (IOException e) { 20 return null; 21 } 22 } 23 24 @Override 25 protected void onPostExecute(Bitmap bitmap) { 26 super.onPostExecute(bitmap); 27 28 if (bitmap != null) { 29 imageView.setImageBitmap(bitmap); 30 } 31 } 32 33 private static Bitmap getImage(Context context, String url) throws IOException { 34 AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT, context); 35 36 HttpGet get = new HttpGet(url); 37 38 try { 39 HttpResponse response = client.execute(get); 40 41 return BitmapFactory.decodeStream(response.getEntity().getContent()); 42 } finally { 43 client.close(); 44 } 45 } 46}

投稿2015/10/14 06:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssa

2015/10/17 06:36

回答ありがとうございます。 返事が遅れてしまい大変申し訳ありませんでした。 以下のようにして実行してemulatorを立ち上げたところ次のようなエラーが出ました。 caused by java.lang.noclassdefFounderror class not found using the boot classloader お教えいただいたことを参考にしてコンストラクタにString urlを追加して試してみました。 public class ImageLoaderTask extends AsyncTask<ImageView, Void, Bitmap> { private static final String USER_AGENT = "WeatherForecasts Sample"; private final Context context; Exception exception; ImageView imageView; //追加 private final String url; public ImageLoaderTask(Context context, String url) { this.context = context; //追加 this.url = url; } @Override protected Bitmap doInBackground(ImageView... params) { imageView = params[0]; //String url = (String) imageView.getTag(); try { return getImage(context, url); } catch (IOException e) { exception = e; } return null; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (bitmap != null) { imageView.setImageBitmap(bitmap); } } private static Bitmap getImage(Context context, String url) throws IOException { AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT, context); HttpGet get = new HttpGet(url); try { HttpResponse response = client.execute(get); return BitmapFactory.decodeStream(response.getEntity().getContent()); } finally { client.close(); } } } またメインアクティビティークラスの部分は以下のようにしました。 ImageView imageView = (ImageView) row.findViewById(R.id.iv_weather); //imageView.setTag(forecast.image.url); ImageLoaderTask task = new ImageLoaderTask(MyActivity.this, forecast.image.url); //urlを追加したつもりです(正直よくわかりません) task.execute(imageView);
退会済みユーザー

退会済みユーザー

2015/10/17 10:37

Exception全文を書いてください.
ssa

2015/10/17 22:22

つぎのようなエラーです。 10-17 22:18:55.872 930-930/? I/art﹕ Not late-enabling -Xcheck:jni (already on) 10-17 22:18:56.015 930-930/? W/Zygote﹕ Slow operation: 1076 ms in ForkAndSpecializeCommon:PostForkChildHooks returns 10-17 22:18:56.017 930-930/? W/Zygote﹕ Slow operation: 1220ms so far, now at Zygote.nativeForkAndSpecialize 10-17 22:18:56.306 930-930/? W/Zygote﹕ Slow operation: 1510ms so far, now at Zygote.postForkCommon 10-17 22:18:56.306 930-930/? W/Zygote﹕ Slow operation: 1515ms so far, now at zygoteConnection.runOnce: postForkAndSpecialize 10-17 22:18:57.067 930-940/io.atsushi.weatherforecasts W/art﹕ Suspending all threads took: 39.763ms 10-17 22:18:57.520 930-940/io.atsushi.weatherforecasts W/art﹕ Suspending all threads took: 11.711ms 10-17 22:18:58.898 930-930/io.atsushi.weatherforecasts D/AndroidRuntime﹕ Shutting down VM --------- beginning of crash 10-17 22:18:58.914 930-930/io.atsushi.weatherforecasts E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: io.atsushi.weatherforecasts, PID: 930 java.lang.RuntimeException: Unable to start activity ComponentInfo{io.atsushi.weatherforecasts/io.atsushi.weatherforecasts.MyActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class LinerLayout at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class LinerLayout at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:757) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:377) at android.app.Activity.setContentView(Activity.java:2144) at io.atsushi.weatherforecasts.MyActivity.onCreate(MyActivity.java:61) at android.app.Activity.performCreate(Activity.java:5937) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)             at android.app.ActivityThread.access$800(ActivityThread.java:144)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:135)             at android.app.ActivityThread.main(ActivityThread.java:5221)             at java.lang.reflect.Method.invoke(Native Method)             at java.lang.reflect.Method.invoke(Method.java:372)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.LinerLayout" on path: DexPathList[[zip file "/data/app/io.atsushi.weatherforecasts-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.view.LayoutInflater.createView(LayoutInflater.java:571) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:665) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:65) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)             at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)             at android.view.LayoutInflater.inflate(LayoutInflater.java:504)             at android.view.LayoutInflater.inflate(LayoutInflater.java:414)             at android.view.LayoutInflater.inflate(LayoutInflater.java:365)             at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:377)             at android.app.Activity.setContentView(Activity.java:2144)             at io.atsushi.weatherforecasts.MyActivity.onCreate(MyActivity.java:61)             at android.app.Activity.performCreate(Activity.java:5937)             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)             at android.app.ActivityThread.access$800(ActivityThread.java:144)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:135)             at android.app.ActivityThread.main(ActivityThread.java:5221)             at java.lang.reflect.Method.invoke(Native Method)             at java.lang.reflect.Method.invoke(Method.java:372)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Suppressed: java.lang.ClassNotFoundException: android.view.LinerLayout at java.lang.Class.classForName(Native Method) at java.lang.BootClassLoader.findClass(ClassLoader.java:781) at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) at java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 26 more Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
退会済みユーザー

退会済みユーザー

2015/10/18 05:49

InflateExceptionが出ています.レイアウトの生成に失敗したのでしょう. "Suppressed: java.lang.ClassNotFoundException: android.view.LinerLayout" と書いてあるので,LinearLayoutをタイポしているのかと思われます.
ssa

2015/10/19 16:06

解決しました。 グダグダと付きあわせてしまい申し訳ありませんでした。 本当に助かりました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2015/10/19 16:31

どういたしまして.解決してよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問