Android下載檔案常見錯誤解決方案,android常見錯誤
最近在學習Mars老師的Android開發課程,仿照http://www.cnblogs.com/Laupaul/archive/2012/02/12/2348293.html的代碼來寫應用,結果中間出了各種各樣的問題,在這裡總結一下:
1.
java.lang.NullPointerException報錯,
android.os.NetworkOnMainThreadException異常
原因:urlCon.getInputStream()執行的時候出錯導致,得不到InputStream。這個異常大概意思是在主線程訪問網路時出的異常。 造成這樣的錯誤原因是代碼不符合Android規範,Android在4.0之前的版本支援在主線程中訪問網路,但是在4.0以後對這部分程式進行了最佳化,也就是說訪問網路的代碼不能寫在主線程中了。
解決辦法:
改用多線程,非同步載入的方式:
String lrc; Handler handler = new Handler() { public void handleMessage(Message msg) { if(msg.what == 0x123) { System.out.println(lrc); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download); downloadTxtButton = (Button)findViewById(R.id.downloadTxt); downloadMp3Button = (Button)findViewById(R.id.downloadMp3); textview = (TextView)findViewById(R.id.textview); downloadTxtButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { new Thread() { public void run() { HttpDownloader httpDownloader = new HttpDownloader(); lrc = httpDownloader.download("http://127.0.0.1/android_download/white_black.lrc"); handler.sendEmptyMessage(0x123); textview.setText(lrc); } }.start(); } }); }
2. android從tomcat讀取檔案出錯:
connect failed: ECONNREFUSED
本地啟tomcat,當想讓android從本機伺服器上下載檔案時,url中IP地址寫127.0.0.1或localhost在模擬器中無效:
W/System.err(12527): java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 8080): connect failed: ECONNREFUSED (Connection refused)
改為原生IP地址也顯示無法串連,終於在網上找到一個非常簡便的方式:android把127.0.0.1當作模擬器本機,而把電腦本地IP設為10.0.2.2,所以只需要把需串連本機電腦web服務地址改為:http://10.0.2.2即可。
3.
Only the original thread that created a view hierarchy can touch its views報錯
Android的相關View和控制項不是安全執行緒的,從報錯資訊可以得知只能由產生View的線程對它做改變,因此將textview.setText(lrc);放到handleMessage()裡即可。
4. 寫檔案到SD卡時出錯:
java.io.IOException: open failed: EACCES (Permission denied)Manifest裡也配置了許可權
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
原因是模擬器的SD卡大小沒有設定,在AVD Manager裡將模擬器的SD卡size設定一下,再跑就沒問題了。
經過一番折騰,終於出了結果:
目前還是新手,所以出了問題就各種不知所措,經驗還是需要慢慢積累的~