2013-06-29 75 views
0

我正在使用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服務器在輔助線程中的響應的建議。

+0

我正在調查[這個優秀的android開發人員文章](http://developer.android.com/training/basics/network-ops/connecting.html)有關的主題;似乎這個問題在這裏得到解決。我會及時向大家發佈。 – kwishnu

+0

k老兄我要刪除我的答案.. :) – TheFlash

回答

0

我只能通過在調用AsyncTask之前調用更新函數來更新本地數據庫;我使用ConnectivityManager(如上面鏈接中所述)來防止發生更新,如果HttpPost不會發生。我認爲這是不夠的,仍然不明白爲什麼我不能使用asyncTask的onPostExecute部分 - 在UI線程中,並且從Web服務器發佈的結果中傳遞結果,似乎是要做到這一點的地方。仍然難倒,所以如果任何人都可以闡明這一點,我會很感激。與此同時,我會將此標記爲我的應用程序正常工作!