AsyncTask 完成數據提交(Android開發實習開始)

其實昨天才是實習第一天,可是項目經理除了讓我去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,下面這段話是兩者的用法區別:Note
2.Toast不能寫在AsyncTask的doInBackGround()方法中,若寫在期中程序會crash,緣由:(1).先看stackoverflow上的一個Toast問題,最關鍵的一句是請輸入圖片描述
(2)doInBackgroud 其實是一個子線程,因此呢,不能進行UI更改。可是能夠重寫onPostExecute方法,在此方法中完成對UI的修改,一旦重寫了此方法,doInBackgroud結束後,就直接調用此方法。服務器

相關文章
相關標籤/搜索