更新:我发现最简单的方法是使用AQuery。
我需要获取我的HttpPost以获取另一个线程上的JSON数据,我不知道如何让它们一起工作。我看了Painless Threading Blog,仍然无法让它发挥作用。
以下是我原来的代码,试图将其解除。
这是我在AsyncTasking的第一次尝试,所以请不要苛刻。日Thnx。
在我的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();
}
};
答案 0 :(得分: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();
}
};
}
答案 1 :(得分:0)
除了setupList()
(假设更新了一些ListView
)和Toast
之外,其余部分应该在doInBackground()
中。您希望尽可能少的代码在主应用程序线程上。