Android网络连线之HttpURLConnection【从网页获取图片 demo】

   日期:2020-04-30     浏览:151    评论:0    
核心提示:萌新必看的网络连线基本操作,还不进来?移动开发

从网页获取图片

效果是这样,下面是代码:

layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
 >
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_target"
        android:text="https://bkimg.cdn.bcebos.com/pic/574e9258d109b3de43046931c3bf6c81800a4c34?x-bce-process=image/resize,m_lfit,w_500,h_500,limit_1"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="visualizer"
        android:onClick="visualizer"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/iv_result"
        />

</LinearLayout>

StreamUtility(把流写在文件上)

public class StreamUtility {
    public static void writeStream2File (InputStream in, File file) throws Exception {
        FileOutputStream outputStream = new FileOutputStream(file);
        int len= -1;
        byte[] buffer = new byte[1024];
        while ((len= in.read(buffer)) !=-1){
            outputStream.write(buffer,0,len);
        }
        outputStream.close();
        in.close();
    }
}

Mainactivity.java

因为子线程不能更新ui,这里有两种方法

1.线程之间通讯构建第三方,利用handler传给主线程再更新ui
2.用runonUIThread方法,直接在子线程更新ui

public class MainActivity extends AppCompatActivity {
    private EditText et_target;
    private ImageView iv_result;
    private Handler handler =new Handler(){
        @Override
        public void handleMessage( Message msg) {
            switch (msg.what){
                case RESPONSE_SUCCESS:
                    Bitmap result = (Bitmap) msg.obj;
                    iv_result.setImageBitmap(result);
                    break;
                case RESPONSE_FAILED:
                    Toast.makeText(MainActivity.this, "失败"+msg.arg1, Toast.LENGTH_SHORT).show();
                    break;
                case RESPONSE_EXCEPTION:
                    Toast.makeText(MainActivity.this, "异常", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };
    private  final int RESPONSE_SUCCESS=1;
    private  final int RESPONSE_FAILED=2;
    private  final int RESPONSE_EXCEPTION=3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_target = (EditText) findViewById(R.id.et_target);
        iv_result = (ImageView) findViewById(R.id.iv_result);
    }
    public void visualizer(View view) {
        final String path = et_target.getText().toString().trim();

            final File file = new File(getCacheDir(), Base64.encodeToString(path.getBytes(),Base64.DEFAULT));

        
        if (file.exists() && file.length()>0){
            Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
            iv_result.setImageBitmap(bitmap);
            System.out.println("-----------------cache");
            return;
        }
        new Thread(){
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                    URL url = new URL(path);
                     connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    int code = connection.getResponseCode();
                    if (code == 200){
                        InputStream inputStream = connection.getInputStream();
                        StreamUtility.writeStream2File(inputStream,file);
                        
                        final Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                        System.out.println("-----------------newload");
                        
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                iv_result.setImageBitmap(bitmap);
                            }
                        });
                  
                        
                    }else {
                        Message msg = Message.obtain();
                        msg.arg1=code;
                        msg.what=RESPONSE_FAILED;
                        handler.sendMessage(msg);
                    }
                } catch (Exception e) {
                    handler.sendEmptyMessage(RESPONSE_EXCEPTION);
                    e.printStackTrace();
                } finally {
                    if (connection != null)
                    connection.disconnect();
                }
            }
        }.start();
    }
}

最后在androidmanifest加上网络权限

 <uses-permission android:name="android.permission.INTERNET"/>
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服