其实昨天才是实习第一天,但是项目经理除了让我去SVN看他们的项目的源代码熟悉项目外啥也没让我干。所以今天才开始正式上手项目,今天做的是android客户端与服务器接口对接,实现数据提交。这个是用AsyncTask异步方式的,话不多说,先上代码。
public class MessageFeedbackActivity extends FragmentActivity {
private EditText edit_feedback;
private Button btn_submit;
private String member_id;
private String content;
private SPreferences SPreferences;
private String submitMessage;
@Override
protected void onCreate(Bundle savedinstancestate) {
super.onCreate(savedinstancestate);
setContentView(R.layout.activity_feedback);
edit_feedback = (EditText) findViewById(R.id.txt_feedback_advice);
//content = edit_feedback.getText().toString().trim(); 这里习惯性的在找到空间后就获取其值,实际上在这一步之前该控件还没有值囧
btn_submit = (Button) findViewById(R.id.btn_feedback_submit);
SPreferences = new SPreferences(this); //
member_id = SPreferences.getSp().getString("c_id", "");//自定义类取出数据
btn_submit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new SubmitFeedback().execute();
}
});
}
private class SubmitFeedback extends AsyncTask<Void, Void, String> {
private List<NameValuePair> paramsList;
private JSONObject jojb;
@Override
protected void onPreExecute() { //在工作线程(doInBackground())之前执行的方法,这里主要用于设置提交参数
content = edit_feedback.getText().toString().trim();
System.out.println("------>>"+content);
paramsList = new ArrayList<NameValuePair>();
paramsList.add(new BasicNameValuePair("member_id", member_id));
paramsList.add(new BasicNameValuePair("content", content));
}
@Override
protected String doInBackGround(Void... params) {//AsyncTask所必须实现的一个方法
String requery = getDataFromServer("memberFeedback",
paramsList, MessageFeedbackActivity.this);
if (requery == null)
return null;
String result = null;
try {
jojb = new JSONObject(requery);
if (jojb == null){
return null;
}
System.out.println(jojb);
System.out.println(result);
result = jojb.getString("code");
submitMessage = jojb.getString("message");
System.out.println(result);
System.out.println(submitMessage);
if (result.equals("200")) { //这里一开始写成equals(200)囧,事实上服务端返回给我们的是一个String....
//Handle
//Toast.makeText(getApplicationContext(),"提交成功","Toast.LENGH_SHORT");
}
else if (result.equals("500")) {
//Handle
}
} catch (JSONException e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) { //该方法运行在UI线程中
super.onPostExecute(result);
Toast.makeText(getApplicationContext(),"提交成功","Toast.LENGH_SHORT");
}
}
}
//以下是从服务端获取数据的工具类(这个工具类是别人写的,我现在还看不懂,只能先拿来用喵~)
public static String getDataFromServer(String action,
List<NameValuePair> paramsList, Context context) {
String requery = comFunction.query(
context.getString(R.string.app_web_url), action, paramsList);
if (requery == null)
return null;
if ("".equals(requery))
return null;
if (requery.equals("net_err")) {
requery = null;
} else if (requery.equals("{\"list\":[]}")) {
requery = null;
} else if (requery.equals("{\"list\":false}")) {
requery = null;
} else if (requery.equals("{\"list\":\"noupdate\"}")) {
requery = null;
}
return requery;
}
有以下几点需要注意:
1、这里Activity继承的是FragmentActivity,为什么不去继承最新的Fragment呢?看这里Difference between Fragment And FragmentActivity,简而言之,Fragment是Android 3.0以后用的,之前的版本要用FragmentActivity,下面这段话是二者的用法区别:
2.Toast不能写在AsyncTask的doInBackGround()方法中,若写在期中程序会crash,原因:(1).先看stackoverflow上的一个Toast问题,最关键的一句是
(2)doInBackgroud 实际上是一个子线程,所以呢,不能进行UI更改。但是可以重写onPostExecute方法,在此方法中完成对UI的修改,一旦重写了此方法,doInBackgroud结束后,就直接调用此方法。