实现图灵机器人分为3步:这里暂时只实现了前两步
0:首先实现发送一个显示一个消息。先不考虑回复的问题。
1:然后实现发送一个消息得到一个回复。先使用模拟的数据,不使用网络,就是回复是自己写的
//将要发送的消息发送给子线程,(给子线程的handler),因为耗时操作不能在主线程进行
// 然后子线程请求数据再返回给主线程(主线程的 handler),因为 子线程不能修改界面的UI
0:首先实现发送一个显示一个消息。先不考虑回复的问题。
1:然后实现发送一个消息得到一个回复。先使用模拟的数据,不使用网络,就是回复是自己写的
//将要发送的消息发送给子线程,(给子线程的handler),因为耗时操作不能在主线程进行
// 然后子线程请求数据再返回给主线程(主线程的 handler),因为 子线程不能修改界面的UI
2:回复是从网络来的。就是添加网络请求和收到回复的功能。
具体步骤如下
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(); } }