標籤:android http java color 使用 檔案
一個APP如果在主線程中請求網路操作,將會拋出此異常。Android這個設計是為了防止網路請求時間過長而導致介面假死的情況發生。
解決方案有兩個,一個是使用StrictMode,二是使用線程來操作網路請求。
第一種方法:簡單暴力,強制使用,代碼修改簡單(但是非常不推薦) 在MainActivity檔案的setContentView(R.layout.activity_main)下面加上如下代碼
| 1234 |
if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);} |
第二種方法就是我使用的方法也是我要推薦的方法,將請求網路資源的代碼使用Thread去操作。在Runnable中做HTTP請求,不用阻塞UI線程。
| 123456789101112131415161718192021222324252627 |
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main_view); new Thread(runnable).start();} Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle data = msg.getData(); String val = data.getString("value"); Log.i(TAG,"請求結果:" + val); }} Runnable runnable = new Runnable(){ @Override public void run() { // TODO: http request. Message msg = new Message(); Bundle data = new Bundle(); data.putString("value","請求結果"); msg.setData(data); handler.sendMessage(msg); }} |
上面是比較通用的方法,My Code:
| 12345678 |
// Android 4.0 之後不能在主線程中請求HTTP請求 new Thread(new Runnable(){ @Override public void run() { cachedImage = asyncImageLoader.loadDrawable(imageUrl, position); imageView.setImageDrawable(cachedImage); } }).start(); |