0

私のアプリでは、データをロードするための接続を開いています。受話器デバイス(galaxy 2)とタブレットp1000(os2.2を搭載した古い7"タブレット)では問題なくデータを取得して解析できますが、別のタブレット(samsung 7" plus --Honeycomb)ではアプリケーションがクラッシュします。logcatは言う:

04-05 16:31:33.905: E/AndroidRuntime(4137): FATAL EXCEPTION: main
04-05 16:31:33.905: E/AndroidRuntime(4137): android.os.NetworkOnMainThreadException
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.net.InetAddress.getAllByName(InetAddress.java:249)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at cam.astro.mania.adapters.NewsAdapter.fetchImages(NewsAdapter.java:105)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at cam.astro.mania.adapters.NewsAdapter.setData(NewsAdapter.java:45)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList.displayData(NewsList.java:359)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList.access$4(NewsList.java:358)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList$MyAsyncTask.onPostExecute(NewsList.java:199)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList$MyAsyncTask.onPostExecute(NewsList.java:1)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.AsyncTask.finish(AsyncTask.java:590)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.AsyncTask.access$600(AsyncTask.java:149)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:603)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.Looper.loop(Looper.java:132)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.app.ActivityThread.main(ActivityThread.java:4123)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.lang.reflect.Method.invokeNative(Native Method)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.lang.reflect.Method.invoke(Method.java:491)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at dalvik.system.NativeStart.main(Native Method)

私のコードは:

/*-------------------------------
     * Downloading images from server
     * ------------------------------*/
    private Bitmap[] fetchImages(ArrayList<String> urlstr){
        InputStream is= null;
        Bitmap bm = null;
        Bitmap[] bmList = new Bitmap[urlstr.size()];

        try {
            for(int i=0; i<urlstr.size(); i++){
                HttpGet httpRequest = new HttpGet(urlstr.get(i));
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);

                HttpEntity entity = response.getEntity();
                BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
                is = bufHttpEntity.getContent();
                bm = BitmapFactory.decodeStream(is); 
                bmList[i] = bm;
            }
        }catch ( MalformedURLException e ){
            Log.d( "RemoteImageHandler", "fetchImage passed invalid URL: " + urlstr );
        }catch ( IOException e ){
            Log.d( "RemoteImageHandler", "fetchImage IO exception: " + e );
        }finally{
            if(is!=null)try{
                is.close();
            }catch(IOException e){}
        }

        return bmList;
    }

LogcatHttpResponse response = (HttpResponse) httpclient.execute(httpRequest); は、エラーの意味がわからないことを指摘しています。何が問題ですか?

ご協力いただきありがとうございます。

4

3 に答える 3

1

このエラーは、メインスレッドでネットワークアクションを実行することを許可されていないことを示しています。

別のスレッドでそれを実行し、非同期で結果を取得する必要があります。

それが役に立てば幸い。

ジョカヒーロー

于 2012-04-05T10:13:18.797 に答える
0

ダウンロードする新しいスレッドを開始し、そこで実行します。ハンドラーへのメッセージを介してメインスレッドに通知する か、join()を使用してスレッドが終了するのを待つだけです

于 2012-04-05T10:18:35.497 に答える
0

このコードを使用して、画像をimageviewにロードできます。

 ImageView ImageView =(ImageView)dialog.findViewById(R.id.ImageView01);
   InputStream is = null;
   try {
        is = (InputStream) new URL(ClueImgURL).getContent();
    } catch (MalformedURLException e) {
              // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
  Drawable d = Drawable.createFromStream(is, "src name");
  ImageView .setBackgroundDrawable(d);

ここで、ClueImgURLは画像のURLです。

于 2012-04-09T06:06:58.173 に答える