Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)

来源:互联网 发布:中英文双语小说 软件 编辑:程序博客网 时间:2024/06/06 04:57
实现图灵机器人分为3步:这里暂时只实现了前两步
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
原创粉丝点击