引言
這周前半部分的工作我們主要對頁面進行了初步設計,也實現了一些功能代碼,後半部分在頁面方面進行了進一步的詳細設計,並且編寫了其他功能代碼,總結一下工作目錄:- 頁面詳細設計與所有頁面基本完成
- 客戶端代碼編寫
- 後臺代碼編寫
這裏我主要針對我這兩天進行的工作:添加好友功能進行介紹。
添加好友
添加好友流程如下:
- 搜索用戶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在我們的努力下也正在慢慢成型,我們都會更加努力。