Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)
来源:互联网 发布:中英文双语小说 软件 编辑:程序博客网 时间:2024/06/06 04:57
实现图灵机器人分为3步:这里暂时只实现了前两步
0:首先实现发送一个显示一个消息。先不考虑回复的问题。
1:然后实现发送一个消息得到一个回复。先使用模拟的数据,不使用网络,就是回复是自己写的
//将要发送的消息发送给子线程,(给子线程的handler),因为耗时操作不能在主线程进行
// 然后子线程请求数据再返回给主线程(主线程的 handler),因为 子线程不能修改界面的UI
0:首先实现发送一个显示一个消息。先不考虑回复的问题。
1:然后实现发送一个消息得到一个回复。先使用模拟的数据,不使用网络,就是回复是自己写的
//将要发送的消息发送给子线程,(给子线程的handler),因为耗时操作不能在主线程进行
// 然后子线程请求数据再返回给主线程(主线程的 handler),因为 子线程不能修改界面的UI
2:回复是从网络来的。就是添加网络请求和收到回复的功能。
代码:handler实现图灵机器人-没有网络请求的版本
具体步骤如下
0:首先实现点击发送以后listView 上面显示发送的信息。
创建布局,创建每个项目的布局,创建listView的adapter,添加按钮事件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <ListView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/listView"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/editText"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送消息" android:onClick="btnSendMessage"/> </LinearLayout></LinearLayout>
每个项的布局:
在layout里面创建item_send
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/item_textview_send" android:background="#6606"/></LinearLayout>
然后创建adapter:
package tech.androidstudio.tulingdemo;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import java.util.List;/** * Created by Kodulf on 2016/3/17. */public class ListViewAdapter extends BaseAdapter { List<String> data; Context context; public ListViewAdapter(List<String> data, Context context) { this.data = data; this.context = context; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) {// return null; View ret = LayoutInflater.from(context).inflate(R.layout.item_send,parent,false); TextView item_send = (TextView) ret.findViewById(R.id.item_textview_send); String sendMessage = data.get(position); item_send.setText(sendMessage); return ret; }}
然后添加监听事件:
public void btnSendMessage(View view) { String message_send = mEditText.getText().toString(); if(message_send!=null){ mData.add(message_send); mAdapter.notifyDataSetChanged(); }}
1:创建子线程的handler 和主线程的handler,
MainActivity的全部代码如下:
package tech.androidstudio.tulingdemo;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements Runnable {private EditText mEditText; private ListView mListView; private List<String> mData; private ListViewAdapter mAdapter; private Handler subHandler; private Handler mainHandler; private final int MAIN_HANDLER_ADD=98; private final int SUB_HANDLER_ADD=998; private final int SUB_HANDLER_EXIT=199; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditText=(EditText)findViewById(R.id.editText); mListView=(ListView)findViewById(R.id.listView); mData = new ArrayList<>(); mAdapter = new ListViewAdapter(mData,this); mListView.setAdapter(mAdapter); mainHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what = msg.what; switch (what){ case MAIN_HANDLER_ADD: String msg_reply = (String)msg.obj; mData.add(msg_reply); mAdapter.notifyDataSetChanged(); break; } } }; //千万别忘了启动子线程,不然会报错 //Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage(android.os.Message)' on a null object reference Thread thread = new Thread(this);//千万别忘了this参数,不然还会报错的。 thread.start(); } public void btnSendMessage(View view) { String message_send = mEditText.getText().toString(); if(message_send!=null){ mData.add(message_send); mAdapter.notifyDataSetChanged(); //将要发送的消息发送给子线程,(给子线程的handler),因为耗时操作不能在主线程进行 // 然后子线程请求数据再返回给主线程(主线程的 handler),因为 子线程不能修改界面的UI Message message = Message.obtain(); message.what=SUB_HANDLER_ADD; message.obj=message_send; subHandler.sendMessage(message); } } @Override public void run() { //绑定 当前线程的Looper Looper.prepare(); subHandler= new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what = msg.what; switch (what){ case SUB_HANDLER_ADD: //获取发送的消息,然后通过HttpUtils来发送,并且得到返回值, //把这个返回值 再给主线程的 handler来处理。 //先写一个模拟数据 ,例如"收到了"发送给主线程。 //TODO 将会添加HttpURLConnection部分内容 Message message = Message.obtain(); message.what=MAIN_HANDLER_ADD; message.obj="收到了"; mainHandler.sendMessage(message); break; case SUB_HANDLER_EXIT: //在onDestroy里面停止这个Looper Looper looper = Looper.myLooper(); looper.quit(); break; } } }; //不停的循环 ,就像是while一样。 Looper.loop(); }}
0 0
- Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)
- 15/9/9/Handler主线程和子线程之间的通讯/AsyncTask
- Android--Handler(承担着子线程和主线程之间的通信)
- Android Handler 主线程 子线程 双向通信
- Android Handler 主线程 子线程 双向通信
- Android Handler 主线程 子线程 双向通信
- Android Handler 主线程 子线程 双向通信
- Android主线程、子线程通信(Thread+handler)
- Android主线程、子线程通信(Thread+handler)
- Android主线程、子线程通信(Thread+handler)
- Android主线程、子线程通信(Thread+handler)
- Android主线程、子线程通信(Thread+handler)
- 深入Android Handler源码,分析主线程、子线程通讯原理
- Android,UI主线程与子线程 handler,thread使用
- Android Handler:主线程如何通知子线程
- Android子线程更新UI主线程方法之Handler
- Android子线程更新UI主线程方法之Handler
- Android Handler:子线程发消息到UI主线程
- 301和302的区别
- 西普实验吧CTF-二叉树遍历
- iOS开发实用工具——CornerStone配置SVN
- [疯狂Java]多线程:线程控制(join、daemon、sleep、yield、优先级)
- MySQL主从复制配置
- Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)
- tomcat架构分析 (JNDI配置)
- Python任务调度模块 – APScheduler
- SpringMVC接收复杂集合参数
- 我的博客搬家啦
- 深入研究Java类加载机制
- [面经]阿里二面
- DNS问题--解析问题
- 简易报告