Android使用okhttp下载图片

在Android开发中,使用OkHttp进行图片下载时遇到问题,发现直接从GitHub下载的jar包缺少okio包导致无法正常下载。解决办法是在build.gradle中添加依赖,或者在主线程中通过设置来允许网络操作,但需注意这不是常规做法,通常网络操作应在工作线程中进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在尝试使用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();
        }

    }

}

运行前,记得在AndroidManifest.xml里添加INTERNET权限。(若忘了添加,无法正常下载,但Studio并不会报错。因此常常是查了半天也不知道问题在哪里)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值