AsyncTask 完成数据提交(Android开发实习开始)

490 查看

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