其實昨天才是實習第一天,可是項目經理除了讓我去SVN看他們的項目的源代碼熟悉項目外啥也沒讓我幹。因此今天才開始正式上手項目,今天作的是android客戶端與服務器接口對接,實現數據提交。這個是用AsyncTask異步方式的,話很少說,先上代碼。android
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"); } }
}web
//如下是從服務端獲取數據的工具類(這個工具類是別人寫的,我如今還看不懂,只能先拿來用喵~)segmentfault
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; }
有如下幾點須要注意:
一、這裏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結束後,就直接調用此方法。服務器