Android-多线程编程(用okhttp实现get请求并显示在主页面上并解析原理)

Handler

异步消息处理机制的使用方法:

public class MainActivity extends AppCompatActivity {

    public static final int UPDATE_TEXT=1;
    private TextView mcontent;
    private static String string;
    private static final String TAG = "MainActivity";
    private final OkHttpClient mclient=new OkHttpClient();

    @SuppressLint("HandlerLeak")
    private Handler handler=new Handler()
    {
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what){
                case UPDATE_TEXT:
                    mcontent.setText(string);

            }
            super.handleMessage(msg);
        }
    };
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mcontent = (TextView) findViewById(R.id.tvContent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.actions,menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
            case R.id.menGet:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        get();
                        Message message=new Message();
                        message.what=UPDATE_TEXT;
                        handler.sendMessage(message);
                    }
                }).start();

                break;
        }
        return super.onOptionsItemSelected(item);
    }

    private void get()
    {

                Request.Builder builder=new Request.Builder();
                builder.url("https://github.com/square/okhttp/blob/master/README.md");
                Request request=builder.build();

                Log.d(TAG,"run:"+request);
                Call call=mclient.newCall(request);
                try {
                    Response response=call.execute();
                    if(response.isSuccessful())
                    {
                        string =response.body().string();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

    }

整形常量UPDATE_TEXT,用于表示更新TextViewde 这个动作,new一个Handler对象,并重写父类的handleMessage()方法,如果发现Message的what字段等于UPDATE_TEXT,就执行UI线程。
在菜单按钮的点击事件中,get()方法使用okhttp对服务器发起get请求,并将response的正文转化成string类型,然后赋值给变量string。然后创建一个message对象,用Handler的sendMessage()将这条message发送出去。很快,Handler收到这条message,并在handleMessage()的方法中进行处理。在这个时候handleMessage()方法中的代码就是在主线程当中运行的了,我们可以在这里进行UI操作。接下来对Message携带的what字段进行判断,如果等于UPDATE_TEXT,TextView的显示内容就会被改变。

Handler的工作原理

  1. Message
    message是线程之间传递的信息,他可以在内部携带少量的信息,用于在不同线程之间交换数据。what,arg1,arg2都是可以用来携带整型数据的;使用obj字段可以携带Object对象。

  2. Handler
    Handler是用来发送和处理消息的。发送消息使用Handler的sendMessage()方法,发出的消息处理之后,最终会传递到Handler的handleMessage()方法中。

  3. MessageQueue
    MessageQueue是消息队列,它用于存放所有通过Handler发送的消息。这部分消息一直存在于消息队列当中,等待被处理,每个线程只会有一个MessageQueue对象。

  4. Looper
    Loopper是每个线程 MessageQueue的管家,调用Looper的loop()方法之后,就会进入一个无限的循环当中,如果MessageQueue中存在一条信息,就会将他取出来,并传递给Handler的handleMessage()方法中,每个线程也只有一个Looper对象

猜你喜欢

转载自blog.csdn.net/xqy3177563/article/details/89260762