Android 4.0用の古いプロジェクトの再定義

今日、私が自分のサイトの新しいケーススタディを書いたとき、猫のトレーニングをしているときに、突然突然問題に遭遇しました。 プログラムコードでは、インターネットからの画像のダウンロードを実装し、SDカードに保存する必要がありました。 一見、タスクは難しくありませんでしたが、プロジェクトは突然エラーを出し始めました。











ここで小さな余談をしなければなりません。 同じバージョンの携帯電話を持っていたので、私は比較的最近Android用のプログラミングを学び始め、バージョンAndroid 2.3から始めました。 そして、同じバージョンでエミュレータ上のすべてのプロジェクトを試しました。 数か月前に、Samsung Galaxy SIIのICS(Android 4.0)のアップデートがリリースされ、新しいバージョンの新しいプロジェクトを作成し、新しいプラットフォームのケーススタディを書き直しました。 定期的に、古いプロジェクトを読み込むときに、Eclipseは取り消し線付きのコード行に遭遇しました。 この方法は時代遅れであり、ドキュメントを読み直す必要があることは明らかでした。



私の最後のケースでは、何も強調されておらず、エラーの性質は完全には明らかではありませんでした。 私のチュートリアルの1つでは、ネットワークからImageViewに画像をアップロードする同様の例を使用しました。これは、Android 2.3で以前は正常に機能していました。 興味を引くために、この例をAndroid 4.0エミュレーターで実行しました。この例が機能することを完全に確信しています。 しかし、そこにあり、この例は開始されませんでした。 例の1行を置き換える



txtUrl.setText(e.toString());
      
      







エラーの説明を得ました-android.os.NetworkOnMainThreadException。 さらに簡単でした。 この情報を手に入れてGoogleに助けを求めたところ、Android 3.0からルールが少し変わったことがわかりました。 これで、メインアクティビティストリームのネットワークリソースにアクセスできなくなりました。 したがって、新しい方法で例を再実行する必要がありました。



コードを表示
 package ru.alexanderklimov.imagefrominet; import java.io.InputStream; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.ImageView; public class ImageFromInetActivity extends Activity { private ImageView imgView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imgView = (ImageView) findViewById(R.id.imgView); // -  String url = "http://developer.alexanderklimov.ru/android/images/android_cat.jpg"; // show The Image new DownloadImageTask(imgView) .execute(url); } private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { ImageView bmImage; public DownloadImageTask(ImageView bmImage) { this.bmImage = bmImage; } protected Bitmap doInBackground(String... urls) { String urldisplay = urls[0]; Bitmap mIcon11 = null; try { InputStream in = new java.net.URL(urldisplay).openStream(); mIcon11 = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return mIcon11; } protected void onPostExecute(Bitmap result) { bmImage.setImageBitmap(result); } } }
      
      











修正版では、この例は機能しました。 おそらくコードはまだ改良が必要ですが、どの方向に移動する必要があるかはすでに明らかです。

確かに、企業や真面目な開発者はこの問題を認識しています。 この問題の解決策は、ドキュメントとStackOverflow.comの両方ですでに説明されています。 専門家は、メインスレッドで長時間の操作を記述しないため、問題にまったく気付きません。 私の場合、作業プロジェクトではインターネットから画像をダウンロードする必要がなかったので驚きました。しかし、ケーススタディでは、このような「間違った」コードに遭遇しました。 そして、多くのアマチュアプログラマにとって、これは頭痛の種になると考えられています。 アプリケーションがインターネットから画像またはその他のファイルのダウンロードを使用する状況を想像してください。 そして、ICSにアップグレードした一部のユーザーは、何も機能していないと不平を言い始めています。 同じ電話モデルを持つユーザーの別の部分は、すべてがうまく機能すると主張します。 問題の原因を推測することは困難です。



結論:Android 4.0での古いプロジェクトのパフォーマンスを確認してください。 昨日、AndroidとAndroid 4の異なるバージョンのデバイス統計の更新は、すでにバージョン2.1を上回っています。 年末までに4人がバージョン2.2にも移行することを完全に認めています。 したがって、この問題について考えなければなりません。



PS問題を解決する際の実験中に、単一の動物が負傷したわけではありません。



All Articles