我正在使用HttpPost方法通過Web服務器從Android設備發送消息。當響應返回時,設備應該更新車載數據庫的格式我用一百萬次,異步後不工作Sqlite數據庫更新
if(postMessage(theMessage).trim().equals("OK")){
DatabaseHelper helper = new DatabaseHelper(ShareDialog.this);
database = helper.getWritableDatabase();
strSharedWith = strSharedWith + theNameEncoded+ "|~|";//my delimiter;
String strFilter = "listTitle= '" + listTitle + "'";
ContentValues values = new ContentValues();
values.put("sharedWith", strSharedWith);
int numRows = database.update("listdata", values, strFilter, null);
database.close();
Toast.makeText(getBaseContext(), numRows + "", Toast.LENGTH_SHORT).show();//Toasts "1"
一切似乎工作:將消息發送到其他設備中,響應從Web服務器返回,並且Toast消息指示一行已更新...但該值保持爲空。任何人都能看到我失蹤的東西?謝謝
編輯:我發現查詢工作正常,如果提前調用AsyncTask ...似乎很奇怪,查詢沒有執行,因爲我知道如果塊(因爲有一個其他塊顯然沒有執行)。冒着尷尬的風險我發佈了AsyncTask的代碼;我知道使用
while (something.equals("")){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
是不好的做法,但這是我得到我的帖子到服務器工作的方式。我現在看到,我最好清理第二個線程的用法,所以如果有人能做到這一點(並告訴我在哪裏更新本地數據庫),我會標記它的答案。哦,注意:使用execSQL的建議會因爲我的管道分隔符不正確的轉義而產生異常 - 我使用的格式會避免這種情況。 OK,用紅色的臉:
if(postMessage(theNameEncoded).trim().equals("OK")){
//was making my database update here, which didn't work
m_adapter.notifyDataSetInvalidated();
loadAdapter();
setListAdapter(m_adapter);
}else{
//alert dialog
}
public String postMessage(String toWhom){
//get stuff from database
strToPost = (assembled from the database call);
new MyAsyncTask().execute(strToPost);
while (privateStatus.equals("")){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (privateStatus.indexOf("OK")>-1){
//the return from the webserver, OK on success
return "OK";
}else{
return "Not a friend";
}
而且,的AsyncTask
private class MyAsyncTask extends AsyncTask<String, Integer, Double>{
protected void onPreExecute() {
//progress dialog started
}
protected Double doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.my-domain.com/list_post.php");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("listSent", strToPost));
nameValuePairs.add(new BasicNameValuePair("fromUser", myName));
nameValuePairs.add(new BasicNameValuePair("toUser", sharingListWith));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
status = httpclient.execute(httppost, new BasicResponseHandler());
while (status.equals("")){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
setStatus(status);
//exception catching
protected void onPostExecute(Double result){
pDialog.dismiss();
}
}
public String setStatus (String theStatus){
if(!theStatus.equals(null)){
privateStatus = theStatus;
}
return null;
}
我知道。而且,其中的兩個{睡覺}的東西。將不勝感激任何關於如何正確合併Web服務器在輔助線程中的響應的建議。
我正在調查[這個優秀的android開發人員文章](http://developer.android.com/training/basics/network-ops/connecting.html)有關的主題;似乎這個問題在這裏得到解決。我會及時向大家發佈。 – kwishnu
k老兄我要刪除我的答案.. :) – TheFlash