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;
} }
Android 线程+Handler的使用的更多相关文章
- android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版
首先原谅我把文章的标题写的这么长.其实我还嫌弃它短了因为 写不下去了所以我就不写了.因为我实在不知道该怎么定义这篇文章的标题或许应该叫 "乱谈"比较合适. 这样可能还体现了 ...
- Android 线程更新UI报错 : Can't create handler inside thread that has not called Looper.prepare()
MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toStri ...
- Android的Handler与Activity线程同步
假设这里有同一个Runnable对象r. 可能采用的方法有: 第一种: handler.post(r); 实际上这种方法并没有调用线程someThread的start方法,而是直接调用了Runaabl ...
- Android 线程通讯类Handler
handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...
- Android线程和handler
根据视频仿照着写了个demo: package com.wyl.wylthreadtest; import android.graphics.Color; import android.os.Bund ...
- 【转】[Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解. [size=1.8em]Handler+Runn ...
- Android——线程通讯 Handler、Looper、Message;
线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...
- [Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解. [size=1.8em]Handler+Runn ...
- Android——线程通讯类Handler(转)
原文地址:http://uule.iteye.com/blog/1705951 handler是线程通讯工具类.用于传递消息.它有两个队列:1.消息队列2.线程队列 消息队列使用sendMessage ...
随机推荐
- JUNIT的用法简要总结
JUNIT是一个单元测试框架,可以用来测试我们程序中的某个模块是否工作正常.而不需要去写一个MAIN函数来测试,方便快捷. 经过对博客http://blog.csdn.net/andycpp/arti ...
- 使用composer安装laravel5.4
composer create-project --prefer-dist laravel/laravel blog 后面的是文件目录
- javascript使用技巧总结,不断更新...
1.使用a标签来获得当前页面相对地址的绝对地址 function getAbsoluteUrl(url){ var a; if(!a) a = document.createElement('a'); ...
- jdbc中Statement和PreparedStatement有什么区别?哪个性能更好?
Statement和PreparedStatement的功能主要是对sql语句的执行 区别 (1)Statement每执行一条sql语句就需要生成一条执行计划,执行100条就需要100条执行计划Pre ...
- combogrid change check multiple
this.SetDict = function (obj, dicType, multiple, Ischeckbox, callback, change) { obj.combogrid({ pan ...
- flex 布局的深入研究
对于flex盒模型的设计期望 flex盒模型是被期望设计成 1:在任何流动的方向上(包括上下左右)都能进行良好的布局 2:可以以逆序 或者 以任意顺序排列布局 3:可以线性的沿着主轴一字排开 或者 沿 ...
- 数据库(学习整理)----7--Oracle导入导出数据库文件
Oracle导入本地数据库操作手册 1.旧数据库忘记了密码,首先进入cmd:1)输入:sqlplus/nolog2)输入:connect/as sysdba3)输入:alter user sys id ...
- Android Service基本知识总结(一)
一.简介 Service是Android系统的后台服务组件,适用于开发无界面.长时间运行的应用功能Service特点如下: 没有用户界面 不会轻易被Android系统终止 在系统资源恢复后Servic ...
- Jquery hover 事件
hover(over,out)一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法.这是一个自定义的方法,它为频繁使用的任务提供了一种“保持在其中”的状态. 当鼠标移动到一个匹配的元素上面时 ...
- winform datagridview数据显示不全
如果是内容是汉字,列的宽度设置不够时会自动换行,如果是数字和字母,是不会自动换行的,要把列宽设得足够,整个表格显示不全时,下面会有横向滚动条,如果看不见可能是高度超出了母控件的高度,设得低点就看见了