我的应用程序适用于姜饼…… ICS和HC崩溃

我需要你的帮助。 我的应用程序在GingerBread上工作正常,但在ICS和HC崩溃。 这是logcat

01-14 20:26:51.831: E/AndroidRuntime(698): FATAL EXCEPTION: main 01-14 20:26:51.831: E/AndroidRuntime(698): android.os.NetworkOnMainThreadException 01-14 20:26:51.831: E/AndroidRuntime(698): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 01-14 20:26:51.831: E/AndroidRuntime(698): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 01-14 20:26:51.831: E/AndroidRuntime(698): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 01-14 20:26:51.831: E/AndroidRuntime(698): at java.net.InetAddress.getAllByName(InetAddress.java:220) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpConnection.(HttpConnection.java:71) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpConnection.(HttpConnection.java:50) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 01-14 20:26:51.831: E/AndroidRuntime(698): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 01-14 20:26:51.831: E/AndroidRuntime(698): at com.bozz.milaircraft.f23$ImageAdapter.getView(f23.java:125) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:192) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.measureVertical(LinearLayout.java:812) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 01-14 20:26:51.831: E/AndroidRuntime(698): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.View.measure(View.java:12723) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.os.Handler.dispatchMessage(Handler.java:99) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.os.Looper.loop(Looper.java:137) 01-14 20:26:51.831: E/AndroidRuntime(698): at android.app.ActivityThread.main(ActivityThread.java:4424) 01-14 20:26:51.831: E/AndroidRuntime(698): at java.lang.reflect.Method.invokeNative(Native Method) 01-14 20:26:51.831: E/AndroidRuntime(698): at java.lang.reflect.Method.invoke(Method.java:511) 01-14 20:26:51.831: E/AndroidRuntime(698): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 01-14 20:26:51.831: E/AndroidRuntime(698): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 01-14 20:26:51.831: E/AndroidRuntime(698): at dalvik.system.NativeStart.main(Native Method) 

这是layout.xml

                                         

这是java代码

 import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.Gallery; import android.widget.ImageView; import android.widget.TabHost; import android.widget.TabHost.TabSpec; public class f23 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.f23); Button bhome = (Button) findViewById(R.id.homebutton); bhome.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub startActivity(new Intent("com.bozz.milaircraft.MENU")); } }); TabHost th = (TabHost) findViewById(R.id.tabhost); th.setup(); TabSpec specs = th.newTabSpec("tag1"); specs.setContent(R.id.tab1); specs.setIndicator("BRIEFING"); th.addTab(specs); specs = th.newTabSpec("tag2"); specs.setContent(R.id.tab2); specs.setIndicator("DESIGN"); th.addTab(specs); specs = th.newTabSpec("tag3"); specs.setContent(R.id.tab3); specs.setIndicator("USERS"); th.addTab(specs); specs = th.newTabSpec("tag4"); specs.setContent(R.id.tab4); specs.setIndicator("GALLERY"); th.addTab(specs); Gallery ga = (Gallery) findViewById(R.id.gallery); ga.setAdapter(new ImageAdapter(this)); } public class ImageAdapter extends BaseAdapter { /** The parent context */ private Context myContext; int imageBackground; /** URL-Strings to some remote images. */ private String[] myRemoteImages = { "http://www.medicinarozzano.it/images/milair/f4_1.jpg", "http://www.medicinarozzano.it/images/milair/f4_2.jpg", "http://www.medicinarozzano.it/images/milair/f4_3.jpg", "http://www.medicinarozzano.it/images/milair/f4_4.jpg", "http://www.medicinarozzano.it/images/milair/f4_5.jpg", "http://www.medicinarozzano.it/images/milair/f4_6.jpg", "http://www.medicinarozzano.it/images/milair/f4_7.jpg", "http://www.medicinarozzano.it/images/milair/f4_8.jpg", "http://www.medicinarozzano.it/images/milair/f4_9.jpg", "http://www.medicinarozzano.it/images/milair/f4_10.jpg"}; /** Simple Constructor saving the 'parent' context. */ public ImageAdapter(Context c) { this.myContext = c; } /** Returns the amount of images we have defined. */ public int getCount() { return this.myRemoteImages.length; } /* Use the array-Positions as unique IDs */ public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } /** * Returns a new ImageView to be displayed, depending on the position * passed. */ public View getView(int position, View convertView, ViewGroup parent) { ImageView i = new ImageView(this.myContext); try { /* Open a new URL and get the InputStream to load data from it. */ URL aURL = new URL(myRemoteImages[position]); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); /* Buffered is always good for a performance plus. */ BufferedInputStream bis = new BufferedInputStream(is); /* Decode url-data to a bitmap. */ Bitmap bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); /* Apply the Bitmap to the ImageView that will be returned. */ i.setImageBitmap(bm); } catch (IOException e) { i.setImageResource(R.drawable.f4_1); Log.e("DEBUGTAG", "Remote Image Exception", e); } /* Image should be scaled as width/height are set. */ i.setScaleType(ImageView.ScaleType.CENTER_INSIDE); /* Set the Width/Height of the ImageView. */ i.setLayoutParams(new Gallery.LayoutParams(480, 640)); return i; } /** * Returns the size (0.0f to 1.0f) of the views depending on the * 'offset' to the center. */ public float getScale(boolean focused, int offset) { /* Formula: 1 / (2 ^ offset) */ return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset))); } } } 

单击“图库”选项卡时,应用程序崩溃。

在您的应用程序的主线程上执行(可能阻止)网络操作是一个坏主意,这正是您正在做的事情。 在Honeycomb(Android 3.0)之前,这只是一个坏主意。 从Android 3.0开始,它是禁止的,如果您尝试这样做,则会收到此exception。

请参阅http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

您需要将此网络逻辑分配到单独的异步线程。 或者,看看Handler 。 您将需要更改代码体系结构; 不容易解决。

在UI线程中不允许使用 Honeycomb网络。 原因是它减慢了用户界面(UI)的速度。

而是尝试在后台线程中下载您的图像,实现它的最简单方法是使用AsyncTask 。

需要您自担风险使用它:

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll() .build(); StrictMode.setThreadPolicy(policy); 

资源: http//developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder.html

您可以查看操作系统的版本,并根据它执行代码。

例如:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) 

这就是我解决问题的方法:

 import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.impl.client.DefaultHttpClient; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.Gallery; import android.widget.ImageView; import android.widget.TabHost; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import android.widget.TabHost.TabSpec; public class f24 extends Activity { private ImageAdapter imageAdapter; private ArrayList PhotoURLS = new ArrayList(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.f24); Button bhome = (Button) findViewById(R.id.homebutton); bhome.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub startActivity(new Intent ("com.bozz.milaircraft.MENU")); } }); TabHost th = (TabHost) findViewById(R.id.tabhost); th.setup(); TabSpec specs = th.newTabSpec("tag1"); specs.setContent(R.id.tab1); specs.setIndicator("BRIEFING"); th.addTab(specs); specs = th.newTabSpec("tag2"); specs.setContent(R.id.tab2); specs.setIndicator("DESIGN"); th.addTab(specs); specs = th.newTabSpec("tag3"); specs.setContent(R.id.tab3); specs.setIndicator("USERS"); th.addTab(specs); specs = th.newTabSpec("tag4"); specs.setContent(R.id.tab4); specs.setIndicator("GALLERY"); th.addTab(specs); imageAdapter = new ImageAdapter(this); final ImageView imgView = (ImageView) findViewById(R.id.GalleryView); Gallery g = (Gallery) findViewById(R.id.Gallery); g.setAdapter(imageAdapter); g.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { imgView.setImageDrawable(LoadImageFromURL(PhotoURLS .get(position))); imgView.setScaleType(ImageView.ScaleType.FIT_CENTER); } }); // replace this code to set your image urls in list PhotoURLS.add("http://www.medicinarozzano.it/images/milair/f4_1.jpg"); PhotoURLS.add("http://www.medicinarozzano.it/images/milair/f4_1.jpg"); new AddImageTask().execute(); } class AddImageTask extends AsyncTask { @Override protected Void doInBackground(Void... unused) { for (String url : PhotoURLS) { String filename = url.substring(url.lastIndexOf("/") + 1, url.length()); filename = "th_" + filename; String thumburl = url.substring(0, url.lastIndexOf("/") + 1); imageAdapter.addItem(LoadThumbnailFromURL(thumburl + filename)); publishProgress(); //SystemClock.sleep(200); } return (null); } @Override protected void onProgressUpdate(Void... unused) { imageAdapter.notifyDataSetChanged(); } @Override protected void onPostExecute(Void unused) { } } private Drawable LoadThumbnailFromURL(String url) { try { URLConnection connection = new URL(url).openConnection(); String contentType = connection.getHeaderField("Content-Type"); boolean isImage = contentType.startsWith("image/"); if(isImage){ HttpGet httpRequest = new HttpGet(url); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = (HttpResponse) httpclient .execute(httpRequest); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(entity); InputStream is = bufferedHttpEntity.getContent(); Drawable d = Drawable.createFromStream(is, "src Name"); return d; } else { Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.no_image); Drawable d = new BitmapDrawable(b); return d; } } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG) .show(); Log.e(e.getClass().getName(), e.getMessage(), e); return null; } } private Drawable LoadImageFromURL(String url) { try { URLConnection connection = new URL(url).openConnection(); String contentType = connection.getHeaderField("Content-Type"); boolean isImage = contentType.startsWith("image/"); if(isImage){ HttpGet httpRequest = new HttpGet(url); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = (HttpResponse) httpclient .execute(httpRequest); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity( entity); InputStream is = bufferedHttpEntity.getContent(); // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(is, null, o); // The new size we want to scale to final int REQUIRED_SIZE = 150; // Find the correct scale value. It should be the power of 2. int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale *= 2; } // Decode with inSampleSize is = bufferedHttpEntity.getContent(); BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; Bitmap b = BitmapFactory.decodeStream(is, null, o2); Drawable d = new BitmapDrawable(b); return d; } else { Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.no_image); Drawable d = new BitmapDrawable(b); return d; } } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG) .show(); Log.e(e.getClass().getName(), e.getMessage(), e); return null; } } public class ImageAdapter extends BaseAdapter { int mGalleryItemBackground; private Context mContext; ArrayList drawablesFromUrl = new ArrayList(); public ImageAdapter(Context c) { mContext = c; TypedArray a = obtainStyledAttributes(R.styleable.Gallery1); mGalleryItemBackground = a.getResourceId( R.styleable.Gallery1_android_galleryItemBackground, 0); a.recycle(); } public void addItem(Drawable item) { drawablesFromUrl.add(item); } public int getCount() { return drawablesFromUrl.size(); } public Drawable getItem(int position) { return drawablesFromUrl.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ImageView i = new ImageView(mContext); i.setImageDrawable(drawablesFromUrl.get(position)); i.setLayoutParams(new Gallery.LayoutParams(150, 120)); i.setScaleType(ImageView.ScaleType.CENTER_INSIDE); i.setBackgroundResource(mGalleryItemBackground); return i; } } } 

但现在我有另一个问题:

如果我不在Android Manifest上声明任何SDK,该应用程序在姜饼和HC以及ICS上都能完美运行。 但是,如果我声明最小SDK大于1或TargetSDK,该应用程序适用于姜饼,但不适用于HC和ISC。 当我点击图库中的图像时,图像查看器上没有任何内容。 然而,一个吐司错误突然出现。

此外,如果没有互联网连接,应用程序崩溃。

最好的问候Tiberio Bozotti

编辑:我可以删除SDK,但在蜂窝上,它不清楚。 意味着布局不兼容。