• android之网络操作(1)


    一、网络操作


    在网络操作中JAVA已经为我提供了一套API用来进行网络操作,在android开发中我们仍可以这套API来做开发。下面通过一个简单的例子来了解一下android下的网络操作。

    点击图中下载按钮从服务器上下载一张图片下来

    二、xml布局文件


    布局文件采用线性布局,只使用到一个button和一个image

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="xidian.dy.com.chujia.MainActivity">
    
            <Button
               android:id="@+id/btn"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="@string/delete"
               />
            <ImageView
                android:id="@+id/img"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:src="@drawable/dog1"
                />
    </LinearLayout>

    三、MainActivity.java


      在代码中当点击事件发生后,就通过通过URL来创建一个HttpURLConnection对象来向服务器建立连接,发起HTTP请求。当请求成功后,表明数据已经在内存中。这时,我们应该从内存中拿到数据并将其封装成一个bitmap对象,这个对象是android提供的,专门用来将从互联网上download的图片直接显示。这些操作我们都放在子线程中,一个原因是google要求必须这样,另一方面如果把耗时操作放在主线程(也就是UI线程)中,会引起主线程阻塞,这样显示界面会卡死。

    package xidian.dy.com.chujia;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class MainActivity extends AppCompatActivity {
        private static ImageView img;
        static  MainActivity ma;
        static Handler handler;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button btn = (Button) findViewById(R.id.btn);
            ma = this;
            handler = new Handler(){
                @Override
                //此方法在主线程中刷新UI
                public void handleMessage(Message msg) {
                    if(img != null){
                        if(msg.what == 0)
                            img.setImageBitmap((Bitmap)msg.obj);
                        else
                            Toast.makeText(ma,"图片下载失败",Toast.LENGTH_SHORT).show();
                    }
                }
            };
            if(btn != null)
                btn.setOnClickListener(new MyLister());
        }
    
        class MyLister implements View.OnClickListener{
            @Override
            public void onClick(View v) {
                img = (ImageView) findViewById(R.id.img);
                new Thread(){
                    @Override
                    public void run() {
                        try {
                            URL url = new URL("http://192.168.0.119/dog.jpg");
                            //创建连接对象
                            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                            //设置请求方式
                            conn.setRequestMethod("GET");
                            //设置TCP连接超时
                            conn.setConnectTimeout(5000);
                            //设置http响应超时
                            conn.setReadTimeout(5000);
                            //建立连接
                            conn.connect();
                            Message msg = handler.obtainMessage();
                            if(conn.getResponseCode() == 200){
                                InputStream is = conn.getInputStream();
                                Bitmap bm = BitmapFactory.decodeStream(is);
                                msg.what = 0;
                                msg.obj = bm;
                                handler.sendMessage(msg);
                            }
                            else {
                                msg.what = 1;
                                handler.sendMessage(msg);
                            }
                            Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
            }
        }
    }

       在MainAactivity中创建一个handler对象是用于可子线程进行数据交互的。主线程在创建的时候,系统会同时创建消息队列对象(MessageQueue)和消息轮询器对象(Looper)线程,轮询器的作用就是不停的检查消息队列中是否有消息,消息队列一旦有消息,轮询器会把消息对象传递给Handler,并调用handler的dispatcherMessage方法。

     public void dispatchMessage(Message msg) {
            if (msg.callback != null) {
                handleCallback(msg);
            } else {
                if (mCallback != null) {
                    if (mCallback.handleMessage(msg)) {
                        return;
                    }
                }
                handleMessage(msg);
            }
        }

    在dispachMessage中会调用我们的handleMessage方法。、

    修改配置文件


    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="xidian.dy.com.chujia">
        <uses-permission android:name="android.permission.INTERNET" />
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

    在配置文件中我们要赋予app访问网络的权限

  • 相关阅读:
    组件之间通信(父传子)
    flex布局
    ffmpeg解析TS流(转)
    swift之?和!的含义(转)
    Swift之画圆角添加多个枚举值方法
    swift之singleton
    swift之闭包
    Swift之fallthrough
    Selector
    Settings Bundle
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5612545.html
Copyright © 2020-2023  润新知