其实昨天才是实习第一天,可是项目经理除了让我去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结束后,就直接调用此方法。服务器