在嘗試使用okhttp的基本功能時,一開始遇到一個很奇怪的問題:我是直接從這個連結下載下傳了jar包并導入到工程裡,結果後面運作時總是無法正常下載下傳圖檔。這個問題查了很久都沒有明白,還以為是自己的代碼寫的不對,然而從網上引用别人的代碼同樣不對。代碼如下:
ImageView imageView = (ImageView) findViewById(R.id.myImage);
OkHttpClient client = new OkHttpClient();
String url = "http://XXXXXXXX";
try {
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
InputStream is = response.body().byteStream();
Bitmap bm = BitmapFactory.decodeStream(is);
imageView.setImageBitmap(bm);
} catch (IOException e) {
e.printStackTrace();
}
最後,在這裡找到了答案:
“......但是由于okHttp内部依賴于okio,是以必須在導入okHttp的同時導入okio。”
是以,GitHub上提供的jar包下載下傳實際上是不完整的,還缺了okio包。不過導jar包首先要找到并下載下傳,然後再添加到工程裡,很是麻煩。是以可以采取簡單一點的辦法,在app的build.gradle裡添加這樣兩句即可:
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okio:okio:1.5.0'
順帶提一句,原則上是不能在Android主線程裡寫網絡操作語句的。不過如果測試代碼能否正常使用時嫌麻煩,就想直接寫在主方法裡,還是有辦法的:在mainActivity的oncreate方法裡添加以下兩句:
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
原理大概就是忽略NetworkOnMainThread這個異常。
是以總代碼如下:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Looper;
import android.os.StrictMode;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.myImage);
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
OkHttpClient client = new OkHttpClient();
String url = "http://XXXXXXXXX";
try {
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
InputStream is = response.body().byteStream();
Bitmap bm = BitmapFactory.decodeStream(is);
imageView.setImageBitmap(bm);
} catch (IOException e) {
e.printStackTrace();
}
}
}