您的位置:首页 > 移动开发 > Android开发

android小项目 连接PHP开发的服务端

2016-07-05 17:36 381 查看
github链接:https://github.com/RenjiaLu9527/AndroidSampledemocnnctMysqlbyPHP//随手打开一个记事本记录开发时的疑惑有点乱20160701-20160705[简单的吐槽小程序]Android-php-mysql////////////////////////////////////////////////////////////start//新建一个txt文档,不输入任何内容。然后“另存为”,将编码由默认的ANSI修改为Unicode或UTF-8。可解决php文件默认编码的问题////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////start//PHP文件返回echo'[OK]'publicclassnetthreadextendsThread{@Overridepublicvoidrun(){Looper.prepare();line="";super.run();try{URLurl=newURL("http://192.168.1.109/mytest/index.php?name="+user+"&psw="+passwd);HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();InputStreamReaderisr=newInputStreamReader(urlConnection.getInputStream());BufferedReaderbr=newBufferedReader(isr);Stringreadbr;while((readbr=br.readLine())!=null)line+=readbr+"\n";urlConnection.disconnect();//关闭http连接}catch(UnknownHostExceptione){e.printStackTrace();line+=e.toString();}catch(IOExceptione){e.printStackTrace();line+=e.toString();}finally{Log.i("Mactivity_Thread","line="+line);Messagemsg=newMessage();//msg.setmsg.obj=newString(line);mHandler.sendMessage(msg);Looper.loop();}}获取的line编码通过msg传到handler后@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);Stringstrmsg=newString("[OK]");msg.obj=newString(msg.obj.toString().replaceAll("\r|\n",""));tvlog.setText("等待服务器回应...\n"+"用户名:"+user+"密码:"+passwd+"\n服务器反馈信息:["+msg.obj+"]");if(strmsg.equals(msg.obj)){Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();Intentntnt_feedback=newIntent(MainActivity.this,feedback.class);startActivity(ntnt_feedback);}else{tvlog.setText(tvlog.getText()+"else["+strmsg+"]");}}[OK]与[OK]总是不相等?whyandroidview显示其值[[OK]]else[[OK]]其中前面的[[OK]]中[[]]贴的不够紧密后[[OK]]中的[[贴的很紧密贴不紧的length()=5贴紧的length()=2【解答】调用此函数处理之后即可去掉其中空格,//处理串publicStringtrimInnerSpaceStr(Stringstr){str=str.trim();while(str.startsWith("")||str.startsWith("\n")){str=str.substring(1,str.length()).trim();}while(str.endsWith("")||str.endsWith("\n")){str=str.substring(0,str.length()-1).trim();}returnstr;}//再次遇到[!]错误:strFlagInfo[0]FLAG判断不等于OK或ERROR[[?OK]][[OK]]php返回echo'OK&'."$name";android先解码后分组再比较时:"OK".equals(strFlagInfo[0])一直false【解答】利用正则表达式去掉其中非字母非数字的隐形字符后就可以了;但是不知为何???strFlagInfo[0]=newString(strFlagInfo[0].toString().replaceAll("[^0-9a-zA-Z]+",""));strFlagInfo[1]=newString(strFlagInfo[1].toString().replaceAll("[^0-9a-zA-Z]+",""));//我保存txt文件时,发现弹窗“该文件含有Unicode格式的字符,若保存ANSI文件将丢失Unicode字符。。。。”我一直剪切保存测试到底是哪个字符是Unicode字符,最后发现是【[[?OK]][[OK]]】中左边的ok有问题,猜测:【待解决】20160705////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////start$sqlr="SELECT*FROMusercommentWHEREumID>=1ANDumID<=5";【取出umID1-5以及umID所属的单条完整数据】与$sqlr="SELECTunIDFROMusercommentWHEREumID>=1ANDumID<=5";【只取出umID1-5:12345而不取出附带数据】不一样;////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////startStringtestStr="abc\\123";//形式表示【abc\\123】;实际表示【abc\123】String[]a=testStr.split("\\\\");//形式表示【\\\\】;实际表示【\\】即:split()以实际【\\】去划分形式【abc\\123】得数组【abc】和【123】////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////start//越来越觉得模块化低耦合性代码的重要性20160704////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////start//PHP中【\\】URLDecode.Decode解码后为【\】容易组合成为转义字符所以慎重正斜杠"/""\\"==>反斜杠/叫斜杠\叫反斜杠*\n:回车*\t:水平制表符*\r:换行*\f:换页*\':单引号*\'':双引号*\\:反斜杠////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////start//代码布局的如何给其中控件添加统一的监听器privateclassfeedbackViewOnClikListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewview){if(view.getid==)}}没有R.id.xx的id匹配【解答】http://www.cnblogs.com/codingblock/p/5090441.html【  ·方案二:在res/values/下添加ids.xml(名字可随意)文件,代码如下:<18e3dbr>1234<?xmlversion="1.0"encoding="utf-8"?><resources><itemname="my_view"type="id"/></resources>  然后在代码中做如下设置即可:1my_view.setId(R.id.my_view);】这样:loadingLayout.setId(R.id.LL_listfooterview);//DIY_id.xml自定义的id////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////startandroid线程handler发送消息activity其实这些线程间发送消息,没有什么;关键还是在于构造Handler时传入谁的Looper.为实现子线程给自己本身发送消息,关键还是在于构造Handler时传入的Looper.*在此就传入该子线程自己的Looper即调用Looper.myLooper(),代码如下:*Looper.prepare();*mHandlerTest1=newHandlerTest1(Looper.myLooper());*Looper.loop();**所以当mHandlerTest1.sendMessage(message);发送消息时*当然是发送到了它自己的消息队列.**当子线程中收到自己发送的消息后,可继续发送消息到主线程.此时只要注意构造*Handler时传入的Handler是主线程的Handler即可,即getMainLooper().http://www.bkjia.com/Androidjc/893149.html////临时Message,防止主线程同时访问msg导致出错Messagemsg_copy=newMessage();msg_copy.obj=newString(msg.obj.toString());//新的类,不是引用msg_copy.what=msg.what;feedback.mhandler.sendMessage(msg_copy);//发送消息msg以引用形式被发送至主线程Looper.loop();////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////start//问题:ListView每次刷新都会跑到最顶,而不是停留在刷新前的页面【解答】【//ListViewlv设置TranscriptMode取消‘alwaysScroll’->永远停在最顶端lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_DISABLED);】借鉴:哈哈,其实我找到问题了。原来在我的listview中加了android:transcriptMode="alwaysScroll"这个属性,导致有变动都会回到底部。在下拉刷新的时候,设置[mw_shl_code=java,true]listview.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_DISABLED);[/mw_shl_code]然后计算下原来的位置,数据刷新Adapter.notifyDataSetChanged();接着就是设置listview.setSelection,这样基本是平滑的,没有跳动。体验不错哦////////////////////////////////////////////end////////////////////////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////////////////////////end////////////////////////////////////////////////////////////////////////////////end////////////////////////////////////20160701-20160705[简单的吐槽小程序]概述:提供注册登陆功能登陆吐槽界面,可在吐槽界面发送文字评论,后台连接php文件,php连接MySql数据库,实现mysql-php-Android的数据传输,本例使用GET方法与php交互。【工程目录】(布局文件中的listfoot.xml文件无效,不用)其中netthread.java为网络传输数据的线程,MainActivity.java为主界面实现用户名密码登陆功能,feedback.java为吐槽界面主要是一个带footerview刷新的ListView;特别的是res/values/diy_id.xml文件,这是个自定义xml,是为了解决下面的一个无法获取在代码布局中的以代码定义的控件的id(R.id.xx)的问题;
【1.问题】
那就说这个问题吧,-问题来源://下面这段代码设置ListView的FooterView,代码布局没有调用xml文件,当我想设置监听器监听这个footerview时,发现在函数里面直接

//AddFooterViewtoListView函数开始{loadingLayout.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewview){}});}//AddFooterViewtoListView函数结尾

</pre>
[code]这样设置监听器时,没反应,我感觉也是不行的,这只是一个函数而不是一个类,函数运行结束就结束了所以达不到监听的效果;所以我将loadingLayout定义成一个全局变量,在函数外面设置其监听器,privateLinearLayoutloadingLayout;//listview的footerview布局//OnCreate函数中添加FooterView到ListViewAddFooterViewtoListview();loadingLayout.setId(R.id.LL_listfooterview);//DIY_id.xml自定义的idloadingLayout.setOnClickListener(newfeedbackViewOnClikListener());然后在重写的监听器中:<prename="code"class="java">privateclassfeedbackViewOnClikListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewview){switch(view.getId()){caseR.id.LL_listfooterview:{}//略<prename="code"class="java"style="font-size:17.6px;font-weight:bold;">[/code]
caseR.id.xx这里发现loadingLayout没有和他匹配的id,因为他是用代码布局的而不是xml;所以得重新通过其他方式指定一个id,
【摘】http://www.cnblogs.com/codingblock/p/5090441.html
//在res/values/下添加ids.xml(名字可随意)文件,代码如下:<?xmlversion="1.0"encoding="utf-8"?><resources><itemname="my_view"type="id"/></resources>  //然后在代码中做如下设置即可:my_view.setId(R.id.my_view);】
【1.问题】完美解决
其他问题我在随笔txt中,大概记录了下,有特别的问题特别说明。
//完整源代码
//MainActivity.javapackagecom.learn4.wheee.androidclient;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;importandroid.widget.Toast;importjava.io.UnsupportedEncodingException;importjava.net.URLDecoder;importjava.net.URLEncoder;importjava.util.Random;publicclassMainActivityextendsActivity{privateEditTextet_username;privateEditTextet_userpsw;privateTextViewtvlog;privateButtonbn_login;//登陆privateButtonbn_register;//注册staticStringURLLOGIN_PHP="http://192.168.1.109/mytest/login.php?a_lgninout=";staticStringURLLOGIN_PHP_IN="IN";//登陆staticStringURLLOGIN_PHP_RGST="RGST";//注册staticStringsttc_name;//正确的name;全局变量整个acitvity共用一个name用户名privateStringusernm;//临时nameprivateStringpasswd;//临时pswpublicHandlermainHandler;privateStringline;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_username=(EditText)this.findViewById(R.id.et_name);et_userpsw=(EditText)this.findViewById(R.id.et_psw);bn_login=(Button)findViewById(R.id.bn_login);//登陆bn_register=(Button)findViewById(R.id.bn_register);//注册tvlog=(TextView)findViewById(R.id.tv_log);//log信息bn_login.setOnClickListener(newMainOnClickLstnr());bn_register.setOnClickListener(newMainOnClickLstnr());mainHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);if(msg.what==0){//与php传输数据流时出错tvlog.setText("[!]错误:android-php网络出错请稍后重试\n耗时:"+msg.getWhen());Toast.makeText(MainActivity.this,"网络出错请稍后重试",Toast.LENGTH_LONG).show();Log.i("mainHandler","[!]错误android-php网络出错请稍后重试");}else{//Stringstrmsg=newString(msg.obj.toString().replaceAll("[^0-9a-zA-Z]+",""));Stringstrmsg=newString(netthread.trimInnerSpaceStr(msg.obj.toString()));Log.i("mainHandler","去掉首尾空格的strmsg="+strmsg);//先分组后解码(login.php文件返回值为【flag&info】)//1-2【分组】String[]strFlagInfo=strmsg.split("&");if(strFlagInfo.length!=2){Log.i("mainHandler","strFlagInfo.length!=2[!]错误strmsg="+strmsg);}//理论上只分成2组//2-2【解码】并去掉解码后的首尾空格回车try{strFlagInfo[0]=netthread.trimInnerSpaceStr(URLDecoder.decode(strFlagInfo[0].toString(),"UTF-8"));strFlagInfo[1]=netthread.trimInnerSpaceStr(URLDecoder.decode(strFlagInfo[1].toString(),"UTF-8"));}catch(UnsupportedEncodingExceptione){e.printStackTrace();}Log.i("mainHandler","分组解码后[OK_or_ERROR]?:strFlagInfo[0]=["+strFlagInfo[0]+"][login_ok_or_MaxId]?:strFlagInfo[1]=["+strFlagInfo[1]+"]");//判断flag是否为OKstrFlagInfo[0]=newString(strFlagInfo[0].toString().replaceAll("[^0-9a-zA-Z]+",""));strFlagInfo[1]=newString(strFlagInfo[1].toString().replaceAll("[^0-9a-zA-Z]+",""));if("OK".equals(strFlagInfo[0])){//操作成功RGST//返回OK和最大ID,更新用户名控件值:【'OK&'+$MaxId;】//IN//	echo'OK&login_ok';Log.i("mainHandler","【操作成功】等待判断是什么操作strFlagInfo[0]="+strFlagInfo[0]+"strFlagInfo[1]="+strFlagInfo[1]);if("LOGINOK".equals(strFlagInfo[1])){//【登陆成功】sttc_name=et_username.getText().toString();//tvlog.setText("登陆成功\n耗时:"+msg.getWhen());Log.i("mainHandler","【登陆成功】sttc_name="+sttc_name+"&跳转到feedback.java");//跳转到feedback.javaToast.makeText(MainActivity.this,"【登陆成功】",Toast.LENGTH_SHORT).show();Intentntnt_feedback=newIntent(MainActivity.this,feedback.class);startActivity(ntnt_feedback);}else{//【注册成功】sttc_name=newString(strFlagInfo[1]);//末尾加上唯一idtvlog.setText("注册成功\n耗时:"+msg.getWhen());Log.i("mainHandler","【注册成功】sttc_name="+sttc_name+"&设置EditText_name_psw的值,等待用户点击登陆按钮");et_username.setText(sttc_name);et_userpsw.setText(passwd);}}elseif("ERROR".equals(strFlagInfo[0].toString())){//操作失败tvlog.setText("[!]错误:php-mysql连接数据库出错\n"+strmsg+"\n耗时:"+msg.getWhen());//输出错误信息Log.i("mainHandler","[!]错误:php-mysql连接数据库出错");}else{Log.i("mainHandler","[!]错误:strFlagInfo[0]FLAG判断不等于OK或ERROR\n[["+strFlagInfo[0]+"]][["+"OK"+"]]");}}//if-elsemsg.what==0?-end//tvlog.setText("等待服务器回应:\n"+"用户名:"+sttc_name+"密码:"+passwd+"\n反馈信息:["+strmsg+"]"+strmsg.length());//if("OK".equals(strmsg)){//Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();//Intentntnt_feedback=newIntent(MainActivity.this,feedback.class);//startActivity(ntnt_feedback);//}elseif("ERROR".equals(strmsg)){//tvlog.setText(tvlog.getText()+"else["+"OK"+"OK".length()+"]");//}}};//mainHandler-end//bn_login.setOnClickListener(newView.OnClickListener(){//@Override//publicvoidonClick(Viewview){//sttc_name=et_username.getText().toString();//passwd=et_userpsw.getText().toString();//////Log.i("MainActivity_bn_OnClick","开始登陆-启动线程连接服务器【"+sttc_name+"】【"+passwd+"】");////newnetthread().start();//Intentntnt_feedback=newIntent(MainActivity.this,feedback.class);//startActivity(ntnt_feedback);////}//});}//onCreate-endclassMainOnClickLstnrimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewview){switch(view.getId()){caseR.id.bn_login:Log.i("MainActivityOnClick","你点击了登陆按钮");usernm=et_username.getText().toString();passwd=et_userpsw.getText().toString();if(usernm==null||passwd==null){//用户名或密码为空EditTextboo=(usernm==null)?et_username:et_userpsw;boo.setHint("请输入"+((usernm==null)?"用户名":"密码"));break;}Log.i("caseR.id.bn_login:","开始登陆-启动线程连接服务器【"+usernm+"】【"+passwd+"】");Stringurl_login="";try{//编码url_login=URLLOGIN_PHP+URLLOGIN_PHP_IN+"&a_name="+URLEncoder.encode(usernm,"UTF-8")+"&a_psw="+URLEncoder.encode(passwd,"UTF-8");}catch(UnsupportedEncodingExceptione){e.printStackTrace();}//启动线程验证登陆信息netthreadntthrd_login=newnetthread(url_login,mainHandler);ntthrd_login.start();break;caseR.id.bn_register:Log.i("MainActivityOnClick","你点击了注册按钮");Stringname_RGST=netthread.trimInnerSpaceStr(""+android.os.Build.MODEL).toString().replace("","");//替换空格Stringpsw_RGST="psw"+(newRandom().nextInt(8999)+1000);//产生1000-9999的随机数//赋值给未检测是否匹配的全局变量usernm=name_RGST;passwd=psw_RGST;//编码Stringurl_rgst="";try{url_rgst=URLLOGIN_PHP+URLLOGIN_PHP_RGST+"&a_name="+URLEncoder.encode(name_RGST,"UTF-8")+"&a_psw="+URLEncoder.encode(psw_RGST,"UTF-8");}catch(UnsupportedEncodingExceptione){e.printStackTrace();}Log.i("caseR.id.bn_register","即将提交的注册信息url_rgst="+url_rgst+"【name_RGST】="+name_RGST+"【psw_RGST】="+psw_RGST);//启动线程发送注册信息netthreadntthrd_rgst=newnetthread(url_rgst,mainHandler);ntthrd_rgst.start();break;default:break;}}}//MainOnClickLstnr-end//publicclassnetthreadextendsThread{//@Override//publicvoidrun(){//Looper.prepare();//line="";//super.run();////try{////URLurl=newURL("http://192.168.1.109/mytest/index.php?name="+sttc_name+"&psw="+passwd);//HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();//InputStreamReaderisr=newInputStreamReader(urlConnection.getInputStream());//BufferedReaderbr=newBufferedReader(isr);//Stringreadbr;//while((readbr=br.readLine())!=null)//line+=readbr+"\n";////isr.close();//urlConnection.disconnect();//关闭http连接////}catch(UnknownHostExceptione){//e.printStackTrace();//line+=e.toString();//}catch(IOExceptione){////e.printStackTrace();//line+=e.toString();//}finally{////Log.i("Mactivity_Thread","line="+line);//Messagemsg=newMessage();////msg.set//msg.obj=newString(line);//mHandler.sendMessage(msg);//Looper.loop();////}//}//}}//ALLEND
//2feedback.javapackagecom.learn4.wheee.androidclient;importandroid.app.Activity;importandroid.content.Context;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.Gravity;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.inputmethod.InputMethodManager;importandroid.widget.AbsListView;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.LinearLayout;importandroid.widget.ListView;importandroid.widget.ProgressBar;importandroid.widget.SimpleAdapter;importandroid.widget.TextView;importandroid.widget.Toast;importjava.io.UnsupportedEncodingException;importjava.net.URLDecoder;importjava.net.URLEncoder;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.List;/***CreatedbyWheeeon2016/7/2.*/publicclassfeedbackextendsActivity{privateStringusername;privateStringusercomment;//footerview的文字与圆形进度框privateProgressBarprogressBar;privateTextViewtextView;privateEditTextet_comment;privateButtonbn_send;staticHandlermhandler;staticStringURLBASE="http://192.168.1.109/mytest/write.php?a_wORr=";staticStringURLBASE_WRT="write";staticStringURLBASE_RD="read";staticintLISTITEMNUM=15;//默认显示20条listitemprivateintLISTITEMNOW=0;//当前共显示了多少条ListViewprivateintLISTVISIBCOUNT=0;//当前页面可以显示多少条数据List<HashMap<String,String>>mylist;//mylist每次获取都更新里面所有值ListViewlv;//ListViewprivateLinearLayoutloadingLayout;//listview的footerview布局@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.feedback_layout);lv=(ListView)findViewById(R.id.lv_a);et_comment=(EditText)findViewById(R.id.et_comment);bn_send=(Button)findViewById(R.id.bn_send);//将MainActivity的name赋值到这里username=MainActivity.sttc_name;//ListViewlv设置TranscriptMode取消‘alwaysScroll’->永远停在最顶端lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_DISABLED);//设置监听器bn_send.setOnClickListener(newfeedbackViewOnClikListener());//初始化//添加FooterView到ListViewAddFooterViewtoListview();loadingLayout.setId(R.id.LL_listfooterview);//DIY_id.xml自定义的idloadingLayout.setOnClickListener(newfeedbackViewOnClikListener());mylist=newArrayList<HashMap<String,String>>();//每次全部替换其值//et_comment.setText("http://192.168.1.109/mytest/write.php?a_user=lurenyi&a_comment=吐槽几句abc123&a_time=2016-07-03-11:00:01");//接收netthread线程反馈消息msg.what1:0mhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);//判断是否为write返回值,不是则为read//操作成功时Log.i("handleMessage","【读】【写】操作判断msg.what="+msg.what+"msg.obj="+msg.obj.toString());if(netthread.SUCCEED_FLAG_WRT.equals(msg.obj.toString())){//【写】操作成功Toast.makeText(feedback.this,"【写】操作成功",Toast.LENGTH_SHORT).show();Log.i("handleMessage","【写】操作成功msg.what="+msg.what);}elseif(msg.what==1){//【读】操作成功//read则msg.obj储存着read数据,已被处理去掉首位空格换行//try{////解码UTF-8PHP中【/】解码后为【/】//msg.obj=URLDecoder.decode(msg.obj.toString(),"UTF-8");//}catch(UnsupportedEncodingExceptione){//e.printStackTrace();//}//先分组再解码//【分组】PHP中【/】解码后为【/】,待处理串中只剩【/】String[]UserCommTime=msg.obj.toString().split("/");//形式表示【\\\\】可以正确划分形式表示为【\\】的数组//【解码】Stringstr="";//临时变量for(inti=0;i<UserCommTime.length;i++){try{str=URLDecoder.decode(UserCommTime[i],"UTF-8");}catch(UnsupportedEncodingExceptione){e.printStackTrace();}UserCommTime[i]=newString(str.toString());}//解码完毕//处理末尾的【读】成功标志位UserCommTime[UserCommTime.length-1]=netthread.trimInnerSpaceStr(UserCommTime[UserCommTime.length-1]);Log.i("handleMessage","处理末尾的【读】成功标志位"+UserCommTime[UserCommTime.length-1]);if(netthread.SUCCEED_FLAG_RD.equals(UserCommTime[UserCommTime.length-1]))//"ROK"==数组最后的分组,理论上是ROK{//Toast.makeText(feedback.this,"确定为【读】操作"+UserCommTime[UserCommTime.length-1],Toast.LENGTH_LONG).show();Log.i("handlMessage",""+"确定为【读】操作"+UserCommTime[UserCommTime.length-1]);//【读】成功//确定不是【写】操作,且获取到【读】操作成功FLAG//调用ListSetAdapter(listview,拆分成数据整条的String数组)ListSetAdapter(UserCommTime);//mylist每次全部替换其值//【读】完成后textview改变值,progressBar隐藏textView.setText("【加载完成】点击加载更多...");progressBar.setVisibility(View.GONE);textView.setFocusableInTouchMode(true);}}//操作失败和成功都显示//Toast.makeText(feedback.this,msg.what==1?"Done":("Failed"+msg.obj.toString()),Toast.LENGTH_LONG).show();Log.i("handlMessage",""+(msg.what==1?"Done"+msg.obj.toString():("Failed"+msg.obj.toString())));}};//第一次运行前获取listitem显示//必须先创建handler实例,第一次只更新LISTITEMNUM数量的ListItemfinalnetthreadntthrd_fstread=newnetthread(URLBASE+URLBASE_RD+("&a_nowid="+LISTITEMNUM),mhandler);ntthrd_fstread.start();//ListView滑动监听lv.setOnScrollListener(newAbsListView.OnScrollListener(){privateStringurl_read=URLBASE+URLBASE_RD;//读取mysql数据privateintlastItemIndex;//是否滑到底了//privatenetthreadntForread=newnetthread("test");@OverridepublicvoidonScrollStateChanged(AbsListViewabsListView,intscrollState){//Log.i("onScrollStateChanged","scrollState="+scrollState);}@OverridepublicvoidonScroll(AbsListViewabsListView,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){Log.i("onScroll","firstVisibleItem="+firstVisibleItem+"visibleItemCount="+visibleItemCount+"totalItemCount="+totalItemCount);lastItemIndex=firstVisibleItem+visibleItemCount-1;//第一个可见的加上当前页面可见的listitem数目=总共-1//更新【当前共显示多少条ListItem】LISTITEMNOW=totalItemCount-1;LISTVISIBCOUNT=visibleItemCount;//当前页面显示多少条Log.i("lastItemIndex","滑动停止最新数据条数:lastItemIndex="+lastItemIndex+"\nLISTITEMNOW="+LISTITEMNOW+"LISTVISIBCOUNT="+LISTVISIBCOUNT);//lastItemIndex索引等于totalItemCount-1时,到达最下面的一个,可以加载刷新view了//if(lastItemIndex>=0&&lastItemIndex==totalItemCount-1&&!ntForread.isAlive()){////Toast.makeText(feedback.this,"刷新中...",Toast.LENGTH_SHORT).show();////ntForread=newnetthread(url_read+("&a_nowid="+lastItemIndex));////ntForread.start();//Log.i("onScroll_ntForread","ntForread.isAlive()线程不在活动中启动线程开始读取listitem");//}elseif(ntForread.isAlive()){//Toast.makeText(feedback.this,"正在刷新中请稍后...",Toast.LENGTH_SHORT).show();////}}});}//Create函数end//更新ListView数据;类作为函数参数传递时,传递的是引用publicvoidListSetAdapter(String[]StrData){Log.i("进入ListSetAdapter","进入ListSetAdapter函数"+StrData.length);//组织数据源mylist=newArrayList<HashMap<String,String>>();//mylist每次全部替换其值//处理StrData,urlencode($row["User"]).'+'.urlencode($row["Comment"]).'+'.urlencode($row["Time"]).'\\';for(inti=StrData.length-2;i>=0;i--){HashMap<String,String>map=newHashMap<String,String>();//中间变量Hashmap初始定义String[]singleData=StrData[i].split("&");//【&】分割符Log.i("","singleData长度"+singleData.length);singleData[1]="["+singleData[2]+"]:"+singleData[1];//singleData[1]=Time+Comment合并为一条数据map.put("itemuser",""+singleData[0]);//USERnamemap.put("itemcomment",""+singleData[1]);//USERcommentmylist.add(map);//添加一条数据}////配置适配器SimpleAdapteradapter=newSimpleAdapter(this,mylist,R.layout.listitem,newString[]{"itemuser","itemcomment"},newint[]{R.id.tv_user,R.id.tv_comment});//adapter.notifyDataSetChanged();//强制刷新新的ListView//添加进去lv.setAdapter(adapter);//判断是否第一次显示而不是后序的加载更多lv.setSelection((!(LISTITEMNOW==-1&&LISTVISIBCOUNT==0))?(LISTITEMNOW-LISTVISIBCOUNT+2):0);//总共显示了多少条数据-当前页面显示多少条Log.i("进入ListSetAdapter","ListView数据添加结束LISTITEMNOW="+LISTITEMNOW+"LISTVISIBCOUNT="+LISTVISIBCOUNT);}privatevoidAddFooterViewtoListview(){/***设置布局显示属性*/LinearLayout.LayoutParamsmLayoutParams=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);/***设置布局显示目标最大化属性*/LinearLayout.LayoutParamsFFlayoutParams=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);//线性布局LinearLayoutlayout=newLinearLayout(this);//设置布局水平方向layout.setOrientation(LinearLayout.HORIZONTAL);//进度条//finalProgressBarprogressBar=newProgressBar(this);progressBar=newProgressBar(this);progressBar.setVisibility(View.GONE);//不占用空间不可见//把进度条加入到layout中layout.addView(progressBar,mLayoutParams);//文本内容//finalTextViewtextView=newTextView(this);textView=newTextView(this);textView.setText("【加载完成】点击加载更多...");//textView.setTextSize(28);//setTextSize()默认的单位是sptextView.setGravity(Gravity.CENTER_VERTICAL);//textView.setOnClickListener(newView.OnClickListener(){//@Override//publicvoidonClick(Viewview){//textView.setText("加载中...");//progressBar.setVisibility(View.VISIBLE);//可见//}//});//把文本加入到layout中layout.addView(textView,FFlayoutParams);//设置layout的重力方向,即对齐方式是layout.setGravity(Gravity.CENTER);//设置ListView的页脚layoutloadingLayout=newLinearLayout(this);loadingLayout.addView(layout,mLayoutParams);loadingLayout.setGravity(Gravity.CENTER);lv.addFooterView(loadingLayout);}//feedbackViewOnClikListenerfeedbackView事件监听器privateclassfeedbackViewOnClikListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewview){switch(view.getId()){caseR.id.LL_listfooterview:{Log.i("feedbackView点击监听器","你点击了ListView的footerview加载更多");//显示圆形进度条progressBar.setVisibility(View.VISIBLE);//可见//感觉这是不安全的做法textView.setText("加载中...");//获取数据库更新ListView;LISTITEMNUM+LISTITEMNOW条数据netthreadntthrd_read=newnetthread(URLBASE+URLBASE_RD+("&a_nowid="+(LISTITEMNUM+LISTITEMNOW)),mhandler);ntthrd_read.start();break;}caseR.id.et_comment:{Log.i("feedbackView点击监听器","你点击了评论编辑框");}caseR.id.bn_send:{//判断是否为空if(et_comment.getText().toString().equals("")){et_comment.setFocusable(true);et_comment.setFocusableInTouchMode(true);break;}Log.i("feedbackView点击监听器","你点击了发送评论的按钮");//发送数据Stringurl_write=URLBASE+URLBASE_WRT;SimpleDateFormatmyfmt=newSimpleDateFormat("yyyy-MM-dd-HH:mm:ss");Datedt=newDate();//获取View数据//username=netthread.trimInnerSpaceStr(""+android.os.Build.MODEL);usercomment=et_comment.getText().toString();Stringtimestr=newString(myfmt.format(dt));try{url_write=url_write+"&a_user="+(URLEncoder.encode(username,"utf-8"))+"&a_comment="+URLEncoder.encode(usercomment,"utf-8")+"&a_time="+URLEncoder.encode(timestr,"utf-8");}catch(UnsupportedEncodingExceptione){e.printStackTrace();}Log.i("setOnClickListener_启动线程",url_write+"");//启动线程netthreadnt_write=newnetthread(url_write,mhandler);nt_write.start();et_comment.setText("");//关闭输入法如果输入法在窗口上已经显示,则隐藏,反之则显示InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);//创建线程更新ListView//获取数据库更新ListView;LISTITEMNUM+LISTITEMNOW条数据netthreadntthrd_read=newnetthread(URLBASE+URLBASE_RD+("&a_nowid="+(LISTITEMNUM+LISTITEMNOW)),mhandler);ntthrd_read.start();}}}}}////点击提交按钮发送至服务器mysql存储//bn_send.setOnClickListener(newOnClickListener(){//@Override//publicvoidonClick(Viewview){////Stringurl_write=URLBASE+URLBASE_WRT;////SimpleDateFormatmyfmt=newSimpleDateFormat("yyyy-MM-dd-HH:mm:ss");////Datedt=newDate();//////////////获取View数据////username=netthread.trimInnerSpaceStr(""+android.os.Build.MODEL);////usercomment=et_comment.getText().toString();////Stringtimestr=newString(myfmt.format(dt));////////try{////url_write=url_write+"&a_user="+////(URLEncoder.encode(username,"utf-8"))+"&a_comment="+////URLEncoder.encode(usercomment,"utf-8")+"&a_time="+////URLEncoder.encode(timestr,"utf-8");////}catch(UnsupportedEncodingExceptione){////e.printStackTrace();////}////Log.i("setOnClickListener_启动线程",url_write+"");//////启动线程////netthreadnt_write=newnetthread(url_write);////nt_write.start();////et_comment.setText("");//}//});//setOnClickListener函数end//3netthread.java网络线程[/code]packagecom.learn4.wheee.androidclient;importandroid.os.Handler;importandroid.os.Looper;importandroid.os.Message;importandroid.util.Log;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;importjava.net.UnknownHostException;publicclassnetthreadextendsThread{privateStringthreadInfo;privateStringurlstring;staticMessagemsg=newMessage();privateHandlerntthrd_handler;//未指定activity的handlerstaticStringSUCCEED_FLAG_WRT="WOK";//操作成功后服务器的返回值writestaticStringSUCCEED_FLAG_RD="ROK";//read//staticbooleanissucceed=false;netthread(Stringurl,Handlerh){this.urlstring=url;this.ntthrd_handler=h;//指定activity}@Overridepublicvoidrun(){Looper.prepare();super.run();threadInfo="";msg.obj=null;msg.what=0;//初始化//0-ERROR表示android端与php传输数据流是出错而不是mysql与php之间的错误try{//GET方式发送数据URLurl=newURL(urlstring);//接收服务器反馈HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();InputStreamReaderisr=newInputStreamReader(urlConnection.getInputStream());BufferedReaderbr=newBufferedReader(isr);Stringstrbr="",Allstrbr="";//中间变量while((strbr=br.readLine())!=null)Allstrbr+=strbr+"\n";threadInfo=Allstrbr;//赋值,去除threadInfo的初始值isr.close();//流关闭urlConnection.disconnect();//关闭http连接msg.what=1;//可能出错的语句全部执行完毕}catch(UnknownHostExceptione){e.printStackTrace();threadInfo+=e.toString()+"AND";msg.what=0;//ERROR}catch(IOExceptione){e.printStackTrace();threadInfo+=e.toString()+"AND";msg.what=0;//ERROR与php传输数据流是出错而不是mysql与php之间的错误}finally{//简单处理去掉首位空格换行threadInfo=trimInnerSpaceStr(threadInfo);Log.i("我是线程:netthread","android-php网络传输过程的信息threadInfo="+threadInfo);msg.obj=newString(threadInfo);//临时Message,防止主线程同时访问msg导致出错Messagemsg_copy=newMessage();msg_copy.obj=newString(msg.obj.toString());//新的类,不是引用msg_copy.what=msg.what;//feedback.mhandler.sendMessage(msg_copy);//发送消息msg以引用形式被发送至主线程this.ntthrd_handler.sendMessage(msg_copy);Looper.loop();}}//处理串去掉String首位所有换行空格staticStringtrimInnerSpaceStr(Stringstr){str=str.trim();while(str.startsWith("")||str.startsWith("\n")){str=str.substring(1,str.length()).trim();}while(str.endsWith("")||str.endsWith("\n")){str=str.substring(0,str.length()-1).trim();}returnstr;}}//listitem.xmlListView的单条数据布局文件[/code]<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/list_item"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="#F0FFFF"android:orientation="horizontal"android:paddingTop="10dp"android:paddingBottom="10dp"><TextViewandroid:id="@+id/tv_user"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="0.2"android:text="用户甲"android:textColor="#000000"android:textSize="20sp"/><ScrollViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="0.8"><TextViewandroid:id="@+id/tv_comment"android:layout_width="match_parent"android:layout_height="match_parent"android:includeFontPadding="true"android:scrollHorizontally="true"android:text="我想吐槽的是......"/></ScrollView></LinearLayout>//feedback_layout.xml[/code]<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/LL_lv"android:layout_marginTop="130px"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/lv_a"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout><LinearLayoutandroid:focusable="true"android:focusableInTouchMode="true"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="100px"android:orientation="horizontal"android:background="#FFFAF0"android:weightSum="1"><EditTextandroid:id="@+id/et_comment"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="0.8"android:hint="吐槽点什么吧.."/><Buttonandroid:id="@+id/bn_send"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="0.2"android:text="发送"/></LinearLayout></RelativeLayout>//MainActivity.xml实现登陆注册界面[/code]
<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@mipmap/ic_launcher"><LinearLayoutandroid:orientation="vertical"android:layout_marginTop="600px"android:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/et_name"android:layout_width="600px"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:hint="用户名"/><EditTextandroid:id="@+id/et_psw"android:layout_width="600px"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:hint="密码"/><RelativeLayoutandroid:layout_width="600px"android:layout_gravity="center_horizontal"android:orientation="horizontal"android:layout_height="wrap_content"><Buttonandroid:id="@+id/bn_login"android:layout_toLeftOf="@id/et_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登陆"/><Buttonandroid:id="@+id/bn_register"android:layout_alignParentRight="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="一键注册"/><TextViewandroid:layout_below="@id/bn_login"android:layout_alignParentRight="true"android:padding="20px"android:id="@+id/tv_log"android:layout_width="6000px"android:layout_height="wrap_content"android:minHeight="600px"android:background="#bf696969"android:text="等待服务器回应..."android:textColor="#696969"android:textSize="30px"/></RelativeLayout></LinearLayout></RelativeLayout>
//diy_id.xml添加id的xml文件<?xmlversion="1.0"encoding="utf-8"?><resources><itemname="LL_listfooterview"type="id"/></resources>最后吐槽一句:csdn每次点开固定两个广告,能不能换换风格,还有这个编辑器比较难用,字体大小颜色说变就变。。不知咋回事。[/code]
忘了php
//login.php
<?php$LGN_IN_RGST=$_GET['a_lgninout'];//denglu-INORzhuce-RGST$name=$_GET['a_name'];$psw=$_GET['a_psw'];$con=mysqli_connect("localhost","root","","testlogin");if(!$con){//die('Couldnotconnect:'.mysqli_error($con));die('ERROR&服务器连接失败请重试');}else{if($LGN_IN_RGST=="IN"){//INmysqli_query($con,'setnamesutf8');$sql="select*fromusersWHEREname='$name'";$result=mysqli_query($con,$sql);//name查询不存在if(!$result){die('ERROR&此用户名没有注册');}$row=mysqli_fetch_array($result,MYSQLI_BOTH);//比较name对应的pswif($psw==$row[2]){echo'OK&LOGINOK';}else{die('ERROR&密码不正确');}}//IN-end////else{//RGST//获取最新的一条数据的umID$sql="selectmax(id)fromusers";$result=mysqli_query($con,$sql);$row=mysqli_fetch_array($result,MYSQLI_BOTH);$MaxId=$row[0]; //zuixin//$name附上当前id,使其独一无二$name=$name.''.$MaxId;mysqli_query($con,'setnamesutf8');$sql="INSERTINTOusers(name,psw)VALUES('$name','$psw')";if(!mysqli_query($con,$sql)){die('ERROR&注册失败请联系管理员');}else{//返回OK和最大ID,更新用户名控件值echo'OK&'."$name";}}//RGST-end}mysqli_close($con);?>[/code]//write.php<?php$con=mysqli_connect("localhost","root","","testlogin");if(!$con){die('Couldnotconnect:'.mysqli_error($con));}$wrtORrd=$_GET['a_wORr'];if($wrtORrd=='write')//WRITE{$comment=$_GET['a_comment'];$user=$_GET['a_user'];$time=$_GET['a_time'];mysqli_query($con,'setnamesutf8');$sql="INSERTINTOusercomment(User,Comment,Time)VALUES('$user','$comment','$time')";if(!mysqli_query($con,$sql)){die('Error:'.mysqli_error($con));}else{echo'WOK';}}elseif($wrtORrd=='read')//READ{$NowId=$_GET['a_nowid']; //获取多少条数据mysqli_query($con,'setnamesutf8');//获取最新的一条数据的umID$sql="selectmax(umID)fromusercomment";$result=mysqli_query($con,$sql);$row=mysqli_fetch_array($result,MYSQLI_BOTH);$MaxId=$row[0]; //zuixin//echo"MaxId=$MaxId";//【MaxId】越界判断//umID没有第0条数据$min=$MaxId-$NowId+1;//NowId条数据if($min<=0){ $min=0;}mysqli_query($con,'setnamesutf8');$sqlr="SELECT*FROMusercommentWHEREumID>=$minANDumID<=$MaxId";$result=mysqli_query($con,$sqlr);//echo'OK';while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){//echo$row["User"].'+'.$row["Comment"].'+'.$row["Time"];//echo'<br>';echourlencode($row["User"]).'&'.urlencode($row["Comment"]).'&'.urlencode($row["Time"]).'/';//echo'<br>';}echo'ROK';//读取结束}else{echo'wrtOrrdERROR';}mysqli_close($con);functioncharacet($data){if(!empty($data)){$fileType=mb_detect_encoding($data,array('UTF-8','GBK','LATIN1','BIG5'));if($fileType!='UTF-8'){$data=mb_convert_encoding($data,'utf-8',$fileType);}}return$data;}?>大概思路:[/code]
androi端点击一键注册按钮,由android端自动生成【用户名】【密码】,经编码后,调用GET方法向write.php传递编码后包含数据的url,write.php收到来自Android端请求,开始解析url,然后对应选择相应语句,发送指令到mysql,要求增加一条表单数据同时将来自android端的【用户名】【密码】发送到mysql;mysql收到来自php的请求,做出反应,向对应表单中增加了一条来自android端的【用户名】【密码】数据,然后返回php,php收到mysql的返回值,判断处理后,再向android端发送返回值,android就收到来自php的反馈信息,处理判断是否操作成功。
写了大段话,按了个靠右快捷键ctrlR居然被刷新,!!!为何不设置个提示,刷新会清空当前所写的????csdn感觉不好啊,刚开始记录代码生涯,若有不妥之处还请告知1176222373@qq.com

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android