2014-11-14 103 views
1

我想觸發每個按鈕上的HTTP發佈請求單擊以從android中的web服務獲取一些數據。我創建了一個異步任務來發送http請求。我的代碼如下:按鈕點擊觸發HTTP請求

活動

public void sendHttpRequest(View view){ 
    //gets called on button click 
    new MyHttpRequestTask(this).execute(); 
} 

MyHttpRequestTask

public class MyHttpRequestTaskextends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPostExecute(Void result) { 
     //Show received data 
     super.onPostExecute(result); 
    } 


    @Override 
    protected Void doInBackground(Void... arg0) { 
     //Send http request 
     return null; 
    } 

} 

我有兩個問題,一個是該onPostExecute方法不被解僱,另一種是,如果我按該按鈕第二次或多次,該任務不被執行。但不知何故,我認爲onPostExecute方法沒有被調用是第二次執行該任務的原因。那麼,我做錯了什麼?我怎樣才能擺脫這些問題?由於

以下是完整的doInBackground方法

@Override 
protected Void doInBackground(Void... arg0) { 
    Looper.prepare(); 
    GpsHelper gpsHelper = new GpsHelper(); 
    LocationHelper locationHelper = new LocationHelper(mContext); 
    gpsHelper.turnGPSOn(); 
    String location = locationHelper.getMyCurrentLocation(); 
    ... 
    String rawHtml = HttpHelper.sendPostRequest(postUrl, postParams); 
    HtmlHelper.processRawHtml(rawHtml); 
    Looper.loop(); 
    return null; 
} 

它利用GPS獲取當前位置,那麼當前的地址,並將其職位,以Web服務,然後從web服務的響應分析和處理。是GPS導致的問題嗎?

+0

沒有看到onpostexecute沒有被調用的原因。請發佈更多詳情。 – rDroid

+0

請求代碼裏面你的doInBack ... – Sivakumar

+0

請按照此代碼。它工作得很好 http://stackoverflow.com/questions/11899793/android-http-post-request-on-clicking-button – vicky

回答

0

在這裏,你應該打電話給你的方法一樣

public MyHttpRequestTask myHttpRequestTask; 

    public void sendHttpRequest(View view){ 
      //gets called on button click 

     //Status.PENDING -- got the status when your asynch task not run yet with same instance 
     //Status.RUNNING -- whether it running 


      if(myHttpRequestTask.getStatus() == Status.FINISHED || myHttpRequestTask.getStatus() ==  Status.PENDING){ 

        myHttpRequestTask = new MyHttpRequestTask(this).execute(); 
       } 


     } 

如果你的非同步的任務是在正在運行的任務則沒有必要再啓動它,它不會被啓動。

如果您在asynchtask的狀態爲完成或掛起時創建新對象,這將是可行的。並且請將日誌或系統放在您的發佈方法中,以便您可以輕鬆識別它是否會被調用。請再檢查一次。

0

請在你的代碼爲此,

public void sendHttpRequest(View view){ 
//gets called on button click 
new MyHttpRequestTask().execute(); 
} 

public class MyHttpRequestTask extends AsyncTask<Void, Void, Void> { 

@Override 
protected Void doInBackground(Void... arg0) { 
    //Send http request 
    return null; 
} 


@Override 
    protected void onPostExecute(Void result) { 

     super.onPostExecute(result); 
     //please put your code here. 


    } 
} 

試試這個代碼,如果有任何問題,那麼請在這裏提一下。

0

經過幾天的撞擊和調試,我終於找到了答案。 由於GPS代碼,onPostExecute未被執行。顯然,啓動gps開始的線程沒有被終止,因此onPostExecute沒有被執行。