0

更新:我发现最简单的方法是使用AQuery

我需要让我的 HttpPost 在另一个线程上获取 JSON 数据,但我不知道如何让它们一起工作。我查看了无痛线程博客,但仍然无法正常工作。

以下是我尝试对其进行同步之前的原始代码。

这是我第一次尝试 AsyncTasking,所以请不要太苛刻。谢谢。

在我的 OnCreate 中:

    /**
     * Connecting to MySQL using PHP and Populate the ListView
     * ========================================================
     */
    mList = (ListView) findViewById(R.id.sidebar_list);

    /** - http post for the list - */
    try  //<--THIS TRY METHOD IS WHAT NEED TO BE ON A SEPERATE THREAD??
    {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("http://192.168.1.34/xxxx/xxxxx_list.php");

    List<NameValuePair> nameValue = new ArrayList<NameValuePair>();
    httpPost.setEntity(new UrlEncodedFormEntity(nameValue));

    HttpResponse httpResponse = httpClient.execute(httpPost);

    HttpEntity httpEntity = httpResponse.getEntity();

    is = httpEntity.getContent();

    } catch (Exception e)
    {
    // TODO handle e
    Log.e("log_tag", "Error in HTTP connect" + e.toString());
    Toast.makeText(this, "HTTP Connection Error : " + e.toString(), Toast.LENGTH_LONG).show();
    }

    // EVERYTHING BELOW HERE CAN BE ON THE UI THREAD???
    /**
     * Convert response to string------------------------------------
     * ----------------------
     * */
    try
    {
    BufferedReader BufR = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
    sb = new StringBuilder();
    sb.append(BufR.readLine() + "\n");

    String line = "0";
    while ((line = BufR.readLine()) != null)
    {
    sb.append(line + "\n");
    }
    is.close();
    result = sb.toString();
    } catch (Exception e)
    {
    // TODO handle e
    Log.e("log_tag", "Error in convert to String" + e.toString());
    }

    // paring data
    int q_id;
    String q_label;
    String q_title;
    String q_description;
    String q_gotoURL;

    try
    {
    jArray = new JSONArray(result);
    JSONObject json_data = null;
    for (int i = 0; i < jArray.length(); i++)
    {
    json_data = jArray.getJSONObject(i);
    q_id = json_data.getInt("_ID");
    q_label = json_data.getString("label");
    q_title = json_data.getString("title");
    q_description = json_data.getString("description");
    q_gotoURL = json_data.getString("gotoURL");
    // mList.add();
    }

    setupList();
    } catch (JSONException e1)
    {
    Toast.makeText(getBaseContext(), "No Data Found", Toast.LENGTH_LONG).show();
    } catch (ParseException e1)
    {
    e1.printStackTrace();
    }

    };
4

2 回答 2

1

我认为你可以尝试这样的事情:

public class MyActivity extends Activity {

// paring data
int q_id;
String q_label;
String q_title;
String q_description;
String q_gotoURL;
Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    mList = (ListView) findViewById(R.id.sidebar_list);
    context = getApplicationContext();
    new HttpTask().execute("http://192.168.1.34/xxxx/xxxxx_list.php");

}
private class HttpTask extends AsyncTask<String, Void, String> {


    protected String doInBackground(String... urls) {
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(urls[0]);

            List<NameValuePair> nameValue = new ArrayList<NameValuePair>();
            httpPost.setEntity(new UrlEncodedFormEntity(nameValue));

            HttpResponse httpResponse = httpClient.execute(httpPost);

            HttpEntity httpEntity = httpResponse.getEntity();

            is = httpEntity.getContent();

            // Get result
            BufferedReader BufR = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            sb = new StringBuilder();
            sb.append(BufR.readLine() + "\n");

            String line = "0";
            while ((line = BufR.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();

        } catch (Exception e) {
            Toast.makeText(context, "HTTP Connection Error : " + e.toString(), Toast.LENGTH_LONG).show();
            return null;
        }
    }

    protected void onPostExecute(String result) {
        try {
            if(result == null)
                throw new Exception("result is null");
            jArray = new JSONArray(result);
            JSONObject json_data = null;
            for (int i = 0; i < jArray.length(); i++) {
                json_data = jArray.getJSONObject(i);
                q_id = json_data.getInt("_ID");
                q_label = json_data.getString("label");
                q_title = json_data.getString("title");
                q_description = json_data.getString("description");
                q_gotoURL = json_data.getString("gotoURL");
                // mList.add();
            }
            //send message to handler to draw list
            drawListHandler.sendEmptyMessage(0);
        } catch (Exception e1) {
            Toast.makeText(context, e1.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
}

Handler drawListHandler = new Handler(){
    /* (non-Javadoc)
     * @see android.os.Handler#handleMessage(android.os.Message)
     */
    @Override
    public void handleMessage(Message msg) {
        setupList();
    }
};
}
于 2012-05-12T02:40:42.520 回答
0

除了setupList()(假设更新了一些ListView)和之外Toast,其余的应该在doInBackground(). 您希望在主应用程序线程上尽可能少的代码。

于 2012-05-12T00:38:56.847 回答