Android 台灣中文網

標題: [已解決,附上解決方式]imageview在手機上無法顯示從網路下載 [打印本頁]

作者: xjxuvup    時間: 2013-1-30 11:24
標題: [已解決,附上解決方式]imageview在手機上無法顯示從網路下載
本帖最後由 xjxuvup 於 2013-3-27 21:45 編輯

解決方式:
在onCreate()裡面加上以下程式碼即可。
  1. StrictMode
  2.     .setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  3.     .detectDiskReads()  
  4.     .detectDiskWrites()  
  5.     .detectNetwork()   // or .detectAll() for all detectable problems  
  6.     .penaltyLog()  
  7.     .build());  
  8. StrictMode
  9.     .setVmPolicy(new StrictMode.VmPolicy.Builder()  
  10.     .detectLeakedSqlLiteObjects()  
  11.     .detectLeakedClosableObjects()  
  12.     .penaltyLog()  
  13.     .penaltyDeath()  
  14.     .build());
複製代碼
流程是,打開APK會出現歡迎畫面也就是放一張從網路讀取的圖片,然後在換layout到主程式頁面
就像最近的Line打開都會出現聖誕節的歡迎畫面

程式在模擬器跑都沒問題,可以正常顯示。
但是只要一放到手機上面跑,就無法顯示從網路讀取之後顯示的圖片。
以下是歡迎頁面的程式碼部分,請各位先進幫忙,感激不盡。
  1. import java.io.InputStream;
  2. import java.net.HttpURLConnection;
  3. import java.net.URL;

  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;

  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.view.Window;
  11. import android.widget.ImageView;

  12. public class Splash extends Activity{
  13.         //宣告LinearLayout變數li
  14.         private ImageView imageView;
  15.         //設定開啟畫面延遲時間
  16.         private final int SPLASH_DISPLAY_LENGTH=10000;
  17.        
  18.         /* (non-Javadoc)
  19.          * @see android.app.Activity#onCreate(android.os.Bundle)
  20.          */
  21.         @Override
  22.         protected void onCreate(Bundle savedInstanceState) {
  23.                 // TODO Auto-generated method stub
  24.                 super.onCreate(savedInstanceState);
  25.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  26.                 setContentView(R.layout.splash);
  27.                
  28.                 //網路圖片路徑
  29.                 String url = "http://xjxuvup1.myweb.hinet.net/3.jpg";
  30.                 //得到可用的圖片
  31.                 Bitmap bitmap = getHttpBitmap(url);
  32.                 imageView = (ImageView)this.findViewById(R.id.imageView);
  33.                 //顯示
  34.                 imageView.setImageBitmap(bitmap);
  35.                
  36.                
  37.                
  38.                 new Handler().postDelayed(new Runnable(){

  39.                         @Override
  40.                         public void run() {
  41.                                 // TODO Auto-generated method stub
  42.                                 Intent mainIntent = new Intent(Splash.this,Motel.class);
  43.                                 Splash.this.startActivity(mainIntent);
  44.                                 Splash.this.finish();
  45.                         }
  46.                        
  47.                 }, SPLASH_DISPLAY_LENGTH);
  48.         }
  49.        
  50.         public static Bitmap getHttpBitmap(String url){
  51.                 URL myFileURL;
  52.                 Bitmap bitmap = null;
  53.                 try{
  54.                         myFileURL = new URL(url);
  55.                         //獲得連接
  56.                         HttpURLConnection conn =
  57.                                         (HttpURLConnection)myFileURL.openConnection();
  58.                         //設置超過時間為6000毫秒,conn.setConnectionTimeout(0);表時沒有時間限制
  59.                         conn.setConnectTimeout(6000);
  60.                         //設定連結獲取數據
  61.                         conn.setDoInput(true);
  62.                         //設定是否使用快取
  63.                         conn.setUseCaches(false);
  64.                         //得到數據
  65.                         InputStream is = conn.getInputStream();
  66.                         //解析得到圖片
  67.                         bitmap = BitmapFactory.decodeStream(is);
  68.                         //關閉連結
  69.                         is.close();
  70.                 }
  71.                 catch(Exception e)
  72.                 {
  73.                         e.printStackTrace();
  74.                 }
  75.                 return bitmap;
  76.         }
  77.        

  78. }
複製代碼

作者: ploglin    時間: 2013-1-30 11:56
看一下 LogCat 中有沒有異常的訊息。
作者: xjxuvup    時間: 2013-1-30 12:09
ploglin 發表於 2013-1-30 11:56
看一下 LogCat 中有沒有異常的訊息。

剛剛看了一下 沒有錯誤訊息
之前有跟同學討論,同學說 會不會是build target的問題
我把他調到Android 2.3.3 跟 Android 4.0.3都沒用

作者: ploglin    時間: 2013-1-30 12:19
應該不可能完全沒錯誤訊息,如果沒有 Error 就看看有沒有 Warning
不然就是在 try catch 的部份自己加一些 Log

另外檢查一下,在AndroidManifest.xml中,有沒有加入權限
<uses-permission android:name="android.permission.INTERNET" />
作者: xjxuvup    時間: 2013-1-30 12:34
ploglin 發表於 2013-1-30 12:19
應該不可能完全沒錯誤訊息,如果沒有 Error 就看看有沒有 Warning
不然就是在 try catch 的部份自己加一些  ...


重新打開eclipse會出現這些紅字訊息,至於權限部分是有設置的
  1. 01-30 12:33:21.310: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520440.000000000
  2. 01-30 12:33:21.460: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520404.463000000
  3. 01-30 12:33:21.585: E/DataRouter(1699): usb connection is true
  4. 01-30 12:33:21.585: E/DataRouter(1699): DSR is ON. Don't send DTR ON.
  5. 01-30 12:33:23.265: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=2, 44009.320000000
  6. 01-30 12:33:23.295: E/PushClient(15511): [b] sendPingReq
  7. 01-30 12:33:23.300: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=2, 43704.076000000
  8. 01-30 12:33:23.390: E/PushClient(15511): [b] __PingReply__
  9. 01-30 12:33:23.395: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=2, 43764.168000000
  10. 01-30 12:33:23.585: E/DataRouter(1699): usb connection is true
  11. 01-30 12:33:23.585: E/DataRouter(1699): DSR is ON. Don't send DTR ON.
  12. 01-30 12:33:24.460: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520440.000000000
  13. 01-30 12:33:24.590: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520407.593000000
  14. 01-30 12:33:25.585: E/DataRouter(1699): usb connection is true
  15. 01-30 12:33:25.585: E/DataRouter(1699): DSR is ON. Don't send DTR ON.
  16. 01-30 12:33:27.585: E/DataRouter(1699): usb connection is true
  17. 01-30 12:33:27.585: E/DataRouter(1699): DSR is ON. Don't send DTR ON.
  18. 01-30 12:33:27.590: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520440.000000000
  19. 01-30 12:33:27.730: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520410.729000000
  20. 01-30 12:33:29.590: E/DataRouter(1699): usb connection is true
  21. 01-30 12:33:29.590: E/DataRouter(1699): DSR is ON. Don't send DTR ON.
  22. 01-30 12:33:30.725: E/Watchdog(1868): !@Sync 673
  23. 01-30 12:33:30.725: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520440.000000000
  24. 01-30 12:33:30.860: E/AlarmManagerService(1868): android_server_AlarmManagerService_set to type=1, 1359520413.863000000
複製代碼

作者: ploglin    時間: 2013-1-30 13:41
看不出異常。

不過我整理一下你的程式邏輯,大致看到一個問題,但不確定是否為問題點,僅提供您參考。
我記得在 runnable 中是無法控制 UI 的,應該是會出現錯誤才對,一般都會用 handler 的 sendEmptyMessage 或是 sendMessage 將程式引導至 handler 的 handleMessage 去控制 UI 的部份。
作者: xjxuvup    時間: 2013-2-5 20:06
感謝版主幫忙解答
最後我是拿同學的code來改,然後就可以了。
他用的方法也是使用sendEmptyMessage來做,謝謝版主。




歡迎光臨 Android 台灣中文網 (https://apk.tw/) Powered by Discuz! X3.1