引言
这周前半部分的工作我们主要对页面进行了初步设计,也实现了一些功能代码,后半部分在页面方面进行了进一步的详细设计,并且编写了其他功能代码,总结一下工作目录:- 页面详细设计与所有页面基本完成
- 客户端代码编写
- 后台代码编写
这里我主要针对我这两天进行的工作:添加好友功能进行介绍。
添加好友
添加好友流程如下:
- 搜索用户id
- 搜索到用户后,输入验证信息
- 输入备注,发送添加请求,附带验证信息,等待回复
所以需要三个界面,搜索界面,验证信息界面,发送界面
1、搜索界面
界面如下所示:
在搜索框中输入用户id或者手机号,点击搜索按钮,即可进行用户搜索。
搜索流程如下:
- 检查网络是否可用
- 根据输入的数据长度判断是手机号还是id
- 发送http请求,等待后台回复
- 若有该用户,则跳转验证信息界面
- 若无该用户,则显示不存在
编码如下:
package com.example.sdu.myflag.activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
import android.widget.Toast;
import com.example.sdu.myflag.base.BaseActivity;
import com.example.sdu.myflag.R;
import com.example.sdu.myflag.util.BaseTools;
import com.example.sdu.myflag.util.NetUtil;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import okhttp3.Response;
public class SearchFriendActivity extends BaseActivity implements SearchView.OnQueryTextListener {
private SearchView sv;
private TextView empty_layout;
String user;
@Override
public int getLayoutId() {
return R.layout.activity_searchfriend;
}
@Override
public void afterCreate(Bundle savedInstanceState) {
init();
sv.setOnQueryTextListener(this);
}
private void init() {
sv = (SearchView) findViewById(R.id.searchView);
empty_layout = (TextView) findViewById(R.id.no_user_tv);
int tv_id = sv.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView tv = (TextView) sv.findViewById(tv_id);
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
}
private void searchFriend(String str) {
if (!BaseTools.isNetworkAvailable(SearchFriendActivity.this)) {
Toast.makeText(SearchFriendActivity.this, "当前网络不可用!", Toast.LENGTH_LONG).show();
return;
}
SearchFriendResult searchFriendResult = new SearchFriendResult();
List<NetUtil.Param> params = new LinkedList<NetUtil.Param>();
if (str.length() == 11) { // 手机号
params.add(new NetUtil.Param("phone", str));
} else { // id
params.add(new NetUtil.Param("id", str));
}
try {
NetUtil.getResult(NetUtil.findUserUrl, params, searchFriendResult);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean onQueryTextSubmit(String query) {
searchFriend(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
private class SearchFriendResult implements NetUtil.CallBackForResult {
@Override
public void onFailure(final IOException e) {
SearchFriendActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SearchFriendActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onSuccess(Response response) {
if (response.isSuccessful()) {
try {
JSONObject jsonObject = new JSONObject(response.body().string());
user = jsonObject.getString("user");
JSONObject userObj = jsonObject.getJSONObject("user");
int uid = userObj.getInt("uid");
if (uid == 0) {
SearchFriendActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
empty_layout.setVisibility(View.VISIBLE);
}
});
} else {
//查找成功,跳转到添加界面
//json解析在添加界面进行
SearchFriendActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
empty_layout.setVisibility(View.GONE);
Intent intent = new Intent();
intent.setClass(SearchFriendActivity.this, AddFriendMessageActivity.class);
intent.putExtra("user", user);
startActivity(intent);
}
});
}
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void searchFriendBack(View view){
this.finish();
}
}
2、验证信息界面
界面如图:
界面逻辑十分简单,只要输入验证信息,点击下一步按钮即可,验证信息会被加入Intent,传递到发送界面,不涉及任何网络请求。
编码如下:
package com.example.sdu.myflag.activity;
import android.content.Intent;
import android.database.CursorJoiner;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.example.sdu.myflag.base.BaseActivity;
import com.example.sdu.myflag.R;
public class AddFriendMessageActivity extends BaseActivity {
private Button next;
private EditText editText;
private Bundle bundle;
@Override
public int getLayoutId() {
return R.layout.activity_addfriendmessage;
}
@Override
public void afterCreate(Bundle savedInstanceState) {
init();
setListener();
}
private void init(){
next = (Button) findViewById(R.id.messageNextButton);
editText = (EditText) findViewById(R.id.messageEditText);
bundle = this.getIntent().getExtras();
}
private void setListener() {
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getText().toString();
String user = bundle.getString("user");
Intent intent = new Intent(AddFriendMessageActivity.this, AddFriendActivity.class);
intent.putExtra("message", message);
intent.putExtra("user", user);
startActivityForResult(intent, 0);
}
});
}
public void friendMsgBack(View view){
this.finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode){
case RESULT_OK:
AddFriendMessageActivity.this.finish();
}
}
}
3、发送界面
界面如下:
界面上显示的信息有:搜索到的用户头像、用户名,验证信息,界面需要输入对用户的备注,用户信息确认无误,并且备注填好后,点击右上角发送按钮即可发送好友请求,用户的信息以及验证信息都是从前面的界面通过Intent中的Bundle传递过来。
发送界面具体逻辑如下:
- 判断网络是否可用
- 网络可用,则判断是否备注输入合法
- 点击发送,按照后台要求参数格式发送好友请求
- 若发送成功,则回到搜索用户界面
- 若发送失败,则弹框
根据逻辑编码如下:
package com.example.sdu.myflag.activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.sdu.myflag.R;
import com.example.sdu.myflag.base.BaseActivity;
import com.example.sdu.myflag.base.BaseApplication;
import com.example.sdu.myflag.util.BaseTools;
import com.example.sdu.myflag.util.NetUtil;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Response;
public class AddFriendActivity extends BaseActivity {
private String user, friendId, message;
private Button sendButton;
private EditText remarkEditText;
private TextView nameTextView, informationTextView;
private ImageView icon_img;
Intent mIntent;
@Override
public int getLayoutId() {
return R.layout.activity_addfriend;
}
@Override
public void afterCreate(Bundle savedInstanceState) {
init();
getJson();
setListener();
}
private void init() {
sendButton = (Button) findViewById(R.id.addFriendSendButton);
nameTextView = (TextView) findViewById(R.id.addFriendNameTextView);
informationTextView = (TextView) findViewById(R.id.addFriendInformationTextView);
remarkEditText = (EditText) findViewById(R.id.addFriendRemarkEditText);
icon_img = (ImageView) findViewById(R.id.icon_img);
mIntent = getIntent();
Bundle bundle = mIntent.getExtras();
user = bundle.getString("user");
message = bundle.getString("message");
}
private void getJson() {
try {
JSONObject userJson = new JSONObject(user);
int iconId = userJson.optInt("photo");
friendId = userJson.optInt("uid") + "";
String friendName = userJson.optString("nickname");
icon_img.setImageDrawable(getResources().getDrawable(BaseApplication.HeadIcon[iconId]));
if (friendName != null) {
nameTextView.setText(friendName);
}
if (message != null) {
informationTextView.setText(message);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
private void setListener() {
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!BaseTools.isNetworkAvailable(AddFriendActivity.this)) {
Toast.makeText(AddFriendActivity.this, "当前网络不可用!", Toast.LENGTH_LONG).show();
return;
}
String remark = remarkEditText.getText().toString();
AddFriendResult addFriendResult = new AddFriendResult();
List<NetUtil.Param> params = new ArrayList<>();
SharedPreferences sharedPreferences = BaseApplication.getInstance().getSharedPreferences("User", Context.MODE_PRIVATE);
String requestId = sharedPreferences.getString("uid", null);
if (requestId == null) {
Toast.makeText(AddFriendActivity.this, "获取用户ID失败!", Toast.LENGTH_SHORT).show();
return;
}
if (friendId == null) {
Toast.makeText(AddFriendActivity.this, "获取好友ID失败!", Toast.LENGTH_SHORT).show();
return;
}
params.add(new NetUtil.Param("id", friendId));
params.add(new NetUtil.Param("requestId", requestId));
params.add(new NetUtil.Param("message", message));
params.add(new NetUtil.Param("remark", remark));
try {
NetUtil.getResult(NetUtil.addFriendUrl, params, addFriendResult);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private class AddFriendResult implements NetUtil.CallBackForResult {
@Override
public void onFailure(final IOException e) {
AddFriendActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AddFriendActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onSuccess(Response response) {
if (response.isSuccessful()) {
AddFriendActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AddFriendActivity.this, "请求发送成功!", Toast.LENGTH_LONG).show();
setResult(RESULT_OK, mIntent);
AddFriendActivity.this.finish();
}
});
}
}
}
public void addFriendBack(View view) {
setResult(RESULT_CANCELED, mIntent);
this.finish();
}
}
4、测试
我的这一块功能的测试工作由朱宏进行,针对每一个界面的逻辑设计多组测试用例,在真机和虚拟机上分别进行测试,直到测试全部通过。
总结
本周的工作告一段落,整体来说功能实现的不错,下周要继续编码工作,app在我们的努力下也正在慢慢成型,我们都会更加努力。