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; } }