zoukankan      html  css  js  c++  java
  • 030 Android 线程+Handler的使用

    1.介绍

    2.线程的使用

    (1)启动

    (2)执行

    3.xml布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical">
    
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layout_marginTop="50dp"
            android:orientation="horizontal">
    
            <ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="70dp"
                app:srcCompat="@mipmap/ic_launcher" />
    
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="70dp"
                android:textSize="50dp"
                android:text="北京时间" />
        </LinearLayout>
        <TextView
            android:layout_gravity="center"
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="70dp"
            android:textSize="50dp"
            android:text="北京时间" />
    </LinearLayout>

    4.java后台

    package com.lucky.test35thread;
    
    import android.annotation.SuppressLint;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    import java.text.SimpleDateFormat;
    
    public class MainActivity extends AppCompatActivity {
        TextView textView;
        @SuppressLint("HandlerLeak")
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                if(msg.what==0x01){
                    String time= (String) msg.obj;
                    //在handler中更新UI界面组件
                    textView.setText(time);
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView=findViewById(R.id.textView2);
            new Thread(){
                @Override
                public void run() {
                    while (true){
                        //设置时间显示格式
                        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        String timestr=simpleDateFormat.format(System.currentTimeMillis());//System.currentTimeMillis()获取当前的时间
                        Message message=new Message();//实例化message
                        message.what=0x01;//设置消息发送的验证码
                        message.obj=timestr;//设置消息的内容
                        handler.sendMessage(message); //利用handler发送消息
                        try {
                            Thread.sleep(1000); //让线程延时一秒
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    }

    效果图:

    UI界面在不断的更新(秒数不断在更新)

    对应的工程名为:test35

     5.handler的典型应用

    功能介绍:在子线程(或异步线程)中,利用handler发送message消息(告诉主线程,子线程的具体运行情况),handler接收到message,进行更新ui

    实现了子线程与主线程的交互。

    注意:以下代码,放入子线程中。

    Message message=new Message();//实例化message
    message.what=0x01;//设置消息发送的验证码
    message.obj=timestr;//设置消息的内容
    handler.sendMessage(message); //利用handler发送消息

    整体代码:

    package com.example.lucky.zjzyhq3.tabslide;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Spinner;
    
    import com.android.volley.AuthFailureError;
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.StringRequest;
    import com.android.volley.toolbox.Volley;
    import com.example.lucky.zjzyhq3.R;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    //企业基本信息页面对应的Fragment
    public class MyFragment_basicMessage extends Fragment {
        Button bt_query;
        EditText et_companyname;
        EditText et_realAddress;
        Spinner sp_riskrank;
        String sp_riskrankStr="";
        String companynameStr="";
        String realAddressStr="";
        final ArrayList<String> resultlist=new ArrayList<>();
        boolean finishFlag=false;
    
        //handler用来处理消息
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                if(msg.what==0x01){
                    ArrayList<String> resultlist= (ArrayList<String>) msg.obj;
                    //1.获取fragment管理者
                    FragmentManager fragmentManager=getActivity().getSupportFragmentManager();
                    //2.开启一个事务
                    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
                    //3.将ll_baisicmessageform线性布局替换为fragment
                    System.out.println("before commit123");
                    fragmentTransaction.replace(R.id.ll_baisicmessageform,MyFragment_basicMessageForm.newInstance(resultlist),"f1"); //注意:第3个参数用于fragment之间相互传递参数
                    //4.提交事务
                    fragmentTransaction.commit();
    
                }
            }
        };
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            // LayoutInflater.inflate()的功能是将一段 XML 资源文件加载成为 View。所以通常用于将 XML 文件实例化为 View。然后获取 View 上的组件最后操作之。
            View view=inflater.inflate(R.layout.layout_basicmessage,container,false);
            componentInit(view);
    
            sp_riskrank.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    String[] riskrank=getResources().getStringArray(R.array.riskrank);
                    sp_riskrankStr=riskrank[position];
                    //注意:Fragment中toast语句的使用
                    //Toast.makeText(getActivity(),sp_riskrankStr,Toast.LENGTH_LONG).show();
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
    
                }
            });
    
            bt_query.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    companynameStr=et_companyname.getText().toString().trim();
                    realAddressStr=et_realAddress.getText().toString().trim();
                    System.out.println("---------companynameStr:"+companynameStr);
                    ArrayList<String> resultlist=queryBasicMessageByUserinput(companynameStr,realAddressStr,sp_riskrankStr);
                    System.out.println("----------hello click");
    
                }
            });
    
            return view;
        }
    
        private void componentInit(View view) {
            bt_query=view.findViewById(R.id.bt_query);
            et_companyname=view.findViewById(R.id.et_companyname);
            et_realAddress=view.findViewById(R.id.et_realAddress);
            sp_riskrank=view.findViewById(R.id.sp_riskrank);
        }
    
        private ArrayList<String> queryBasicMessageByUserinput(final String companynameStr, final String realAddressStr, final String sp_riskrankStr) {
            //请求地址
            String url = "http://118.25.152.62:8080/MyJavaWebTest02_war/BasicMessageServlet";    //注①
            String tag = "BasicMessage";    //注②
    
            //取得请求队列
            final RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
    
            //防止重复请求,所以先取消tag标识的请求队列
            requestQueue.cancelAll(tag);
    
            //创建StringRequest,定义字符串请求的请求方式为POST(省略第一个参数会默认为GET方式)
            final StringRequest request = new StringRequest(Request.Method.POST, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            try {
                                int resultcount=0;
                                JSONObject jsonObject=null;
    
                                //注意:当response为空时,说明服务器无响应(服务器端的代码有问题)
                                if(!TextUtils.isEmpty(response)){
                                    jsonObject = (JSONObject) new JSONObject(response).get("params");  //注③
                                    String resultTemp = jsonObject.getString("resultcount");  //注④
                                    resultcount=Integer.parseInt(resultTemp);
                                    System.out.println("response----"+resultcount);
                                }
    
                                System.out.println("----------"+resultcount);
    
                                for (int i = resultcount; i >0 ; i--) {
                                    String resultTemp = jsonObject.getString("result"+i);  //注④
                                    resultlist.add(resultTemp);
                                }
    
                                //当服务器连接成功,获得响应后,用Message对象传递消息,在Activity或fragment中处理。
                                Message message=new Message();//实例化message
                                message.what=0x01;//设置消息发送的验证码
                                message.obj=resultlist;//设置消息的内容
                                handler.sendMessage(message); //利用handler发送消息
    
                            } catch (JSONException e) {
                                //做自己的请求异常操作,如Toast提示(“无网络连接”等)
                                Log.e("TAG", e.getMessage(), e);
                            }
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //做自己的响应错误操作,如Toast提示(“请稍后重试”等)
                    Log.e("TAG", error.getMessage(), error);
                }
            }) {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    //创建一个Map集合,用于存储元素对(称作“键”和“值”),其中每个键映射到一个值
                    Map<String, String> params = new HashMap<>();
                    params.put("Companyname", companynameStr);
                    params.put("RealAddress", realAddressStr);
                    params.put("Riskrank", sp_riskrankStr);
    //                params.put("Company", companyStr);
                    return params;
                }
            };
    
            //设置Tag标签
            request.setTag(tag);
    
            //将请求添加到队列中
            requestQueue.add(request);
    
            return resultlist;
        }
    
    
    }
  • 相关阅读:
    序列化与反序列化
    SQL Server 中常见的十张系统表
    DataGridView的18中用法
    文件操作
    数据库的学习
    GUI图形图像编程主要技术的学习梳理
    软件研发过程中常用图形总结
    windows10 升级1803后,远程错误提示“出现身份验证错误,要求的函数不受支持 CredSSP 加密 Oracle修正”的解决办法
    SQLServer中按照任意分钟(5分钟、10分钟)分组统计数据
    支付宝APP支付,提示代码 ALIN10070
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10517234.html
Copyright © 2011-2022 走看看