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 ...
随机推荐
- mfs教程(三)
mfs文件系统(三) 使用 MooseFS 一.挂载文件系统 启动管理服务器(master server)和数据服务器(chunkservers) (chunkservers一个是必需的,但至少两个 ...
- YII2 模型关联之 一对多
需求,一个用户有多篇文章全部查询出来 文章表 用户表 //首先查找出一个用户出来 $user=Users::find()->'])->one(); //第一个参数还是关联的模型,第二个依旧 ...
- 33.HAVING 子句
HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用. SQL HAVING 语法 SELECT column_name, aggregate_f ...
- aspx页面上输出xml的问题
在aspx页面上输出xml,需要在后台输出编码格式和编码类型,如下代码: Response.Charset = "utf-8";//格式Response.ContentType = ...
- BBS后台发送邮件&修改文章
一:Django发送邮件 在setting中配置 # EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST ...
- javax.servlet.jsp.PageContext cannot be resolved to a type
<dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifa ...
- 解决Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of the configured nodes are available
Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of ...
- OpenSSH/PuTTY/SSH使用
OpenSSH/PuTTY/SSH 常用SSH服务指令 ① 启动SSH服务的命令 service sshd start ② 停止SSH服务的命令 service sshd stop ③ 重新启动SSH ...
- Javascript脚本 :Function 对象的定义和使用
javascript Function 对象的定义 创建函数的语法:var myFunction=new Function(arg1,arg2,...agrN,body);agrN 为函数的参数,b ...
- WinForm中的多语言处理
配置文件中存储当前语言环境,切换语言时进行修改,启动程序时读取该配置并设置当前线程的Culture 可根据线程的语言环境动态读取不同的资源文件,不同资源文件名用语言环境文本进行区分