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

最新文章

  1. Android开发案例 - 淘宝商品详情
  2. java中文乱码解决之道(五)-----java是如何编码解码的
  3. Runloop 深入理解(转)
  4. list对象属性排序
  5. CSS和JavaScript标签style属性对照表
  6. IIS 10.0 无法安装 URL rewrite重写模块 2.0解决办法
  7. 处理Oracle中杀不掉的锁
  8. 高级I/O之非阻塞I/O
  9. [java学习笔记]java语言核心----面向对象基础
  10. Linux永久挂载远程网络目录
  11. javascript 下拉列表 自己主动取值 无需value
  12. 利用Sambaserver在Ubuntu系统和Win7系统间共享目录
  13. 从Chrome源码看浏览器的事件机制
  14. 201521123015 《Java程序设计》第5周学习总结
  15. Asp.NetCore+Microsoft.AspNetCore.SignalR前后端分离
  16. mailto链接
  17. DEDECMS 多站用一个站图片
  18. 【深度学习】吴恩达网易公开课练习(class1 week2)
  19. Android APK反编译详解(附图) (转)
  20. VB脚本错误,系统找不到制定的文件 。代码:80070002

热门文章

  1. 扩展卡尔曼滤波EKF与多传感器融合
  2. jdbc中Statement和PreparedStatement有什么区别?哪个性能更好?
  3. Git安装和常用命令
  4. LightOJ 1248 Dice (III) (水题,期望DP)
  5. 三解炸弹人——DFS
  6. CreateExcel 导出Excel
  7. 搭建自己的git服务器--gogs
  8. 我用Django搭网站(3)-表单RSA加密
  9. 如何让win32对话框居中显示
  10. [.net 多线程]AutoResetEvent, ManualResetEvent