4

「Sam'sTeachYourselfAndroid Application Development in 24 Hours」を実行しようとしていますが、12時間でスタックしました。問題は次のセクションにあるようです。

private Drawable getQuestionImageDrawable(int questionNumber) {
    Drawable image;
    URL imageUrl;

    try {
        // Create a Drawable by decoding a stream from a remote URL
        imageUrl = new URL(getQuestionImageUrl(questionNumber));
        InputStream stream = imageUrl.openStream();
        Bitmap bitmap = BitmapFactory.decodeStream(stream);
        image = new BitmapDrawable(getResources(), bitmap);
    } catch (Exception e) {
        Log.e(TAG, "Decoding Bitmap stream failed");
        image = getResources().getDrawable(R.drawable.noquestion);
    }
    return image;
}

questionNumberとはgetQuestionImageUrl()テストされており、正しい値(1とhttp://www.perlgurl.org/Android/BeenThereDoneThat/Questions/q1.png)であると私が信じているものを返しています。そのURLに画像がありますが、私は常に例外を受け取ります。私はいくつかのバリエーションを試しましたが、どれもうまくいかなかったとき、私は本からこのコードに戻りました。私はここで何が間違っているのですか?

私はJavaとAndroidに慣れていないので、おそらく単純なものが欠けています。私は本のコードとウェブサイトからの更新されたコードに関して他の多くの問題を抱えていました(それらはすべてここまたはで解決されましたdeveloper.android.com)。これが私の最初の質問ですので、情報を提供できなかった場合はお知らせください。

4

2 に答える 2

2

私は次のことをします、そしてそれはうまくいくかもしれません:

private Drawable getQuestionImageDrawable(int questionNumber) {
Drawable image;
URL imageUrl;

try {
    // Create a Drawable by decoding a stream from a remote URL
    imageUrl = new URL(getQuestionImageUrl(questionNumber));
    HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();
    InputStream stream = conn.getInputStream();
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    image = new BitmapDrawable(getResources(), bitmap);
} catch (Exception e) {
    Log.e(TAG, "Decoding Bitmap stream failed");
    image = getResources().getDrawable(R.drawable.noquestion);
}
return image;
}

メインスレッドの代わりにバックグラウンドスレッドでこの種の重い操作を実行し、アプリケーションのマニフェストに対するINERNET権限を持っていることを確認してください。進捗状況を教えてください。

于 2012-11-06T19:17:01.547 に答える
0

おそらく例外は、アプリのUIスレッドからネットワーク接続を確立しているためです。これは古いAndroidバージョンでは機能しますが、新しいバージョンでは機能しません。Androidネットワークの操作セクションをご覧ください。

主なことは、AsyncTaskを使用することです

于 2012-11-06T18:51:29.650 に答える