簡體   English   中英

如何使用單獨的線程來執行http請求

[英]How to use separate thread to perform http requests

我有一個應用程序在用戶單擊某些按鈕時執行HTTP請求(特別是調用FogBugz API)。 現在,我只是在應用程序啟動時創建服務,然后在該服務中調用不同的方法來完成請求。 但是,當我這樣做時,UI線程中通常會掛起。 我看過AsyncTask,但我不確定它會做我想要完成的事情。 因為我需要立即解析HTTP請求返回的XML,所以我需要有一個能夠將此數據返回給UI線程的進程。 ASyncTask能否實現這一目標,還是有其他方式?

    public static InputStream makeRequest(String httpRequest)
    {
        In a separate thread, run HTTP Request, get back and process, return inputstream
    }

其他幾個人調用此方法來執行HttpRequests。 返回輸入流后,其他方法將解析特定信息。

最簡單的方法就是做類似的事情

//Body of your click handler
Thread thread = new Thread(new Runnable(){
  @Override
  public void run(){
    //code to do the HTTP request
  }
});
thread.start();

這將導致run()方法內的代碼在新的執行線程中執行。 如果您願意,可以查看異步任務,盡管我個人從未使用它。 這是完成工作的快速而簡單的方法。

關於向后傳遞信息,我將使用一個Handler對象 ,它有效地允許您為給定線程設置消息隊列並將消息傳遞給它,從而導致執行特定代碼。 你需要這樣做的原因是因為Android不會讓UI線程以外的任何線程更新實際的UI。

這是否解決了您的問題? 我知道我的第一次傳球沒有完全解決你的所有問題。

編輯基本上,您所做的是在Activity定義一個處理程序對象

private Handler handler_ = new Handler(){
    @Override
    public void handleMessage(Message msg){

    }

};

您還可以創建靜態int常量,以幫助告訴處理程序要執行的操作。 您基本上使用它們來允許將幾種不同類型的消息傳遞給處理程序的一個實例。 如果只有一條消息會被傳回,那么您不必擔心這一點。

例如

private static final int UPDATE_UI = 1;

向您調用的處理程序發送消息

handler_.sendMessage(Message.obtain(handler_, UPDATE_UI, inputStreamInstance));

從處理程序:

private Handler handler_ = new Handler(){
    @Override
public void handleMessage(Message msg){
    switch(msg.what){
            case UPDATE_UI:
            InputStream is = (InputStream)msg.obj;
            //do what you need to with the InputStream
            break;
        }
    }

};

或者,如果將inputStreamInstance添加到Message對象,您可以傳遞任何您喜歡的對象,因此如果您想將其解析為某種容器對象或類似的東西,您也可以這樣做。 只需從處理程序中將其強制轉換回該對象即可。

嘗試使用AsyncTask。 轉到此鏈接了解更多信息:

private class SyncIncoData extends AsyncTask<String, String, String> {
    ProgressBar pb;
    ProgressBar pbar;

    @Override
    protected String doInBackground(String... urls) {
        for (int i = 0; i <= 100; i++) {
            publishProgress(i);
        }
        return null;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();

        pb = (ProgressBar) findViewById(R.id.progressBarsync4);
        pb.setVisibility(View.VISIBLE);

    }

    @Override
    protected void onPostExecute(String result) {

        pb = (ProgressBar) findViewById(R.id.progressBarsync4);
        pb.setVisibility(View.INVISIBLE);

    }

    @Override
    protected void onProgressUpdate(String... values) {
        pbar = (ProgressBar) findViewById(R.id.progressBarpbar);
        pbar.setProgress(Integer.parseInt(values[0]));
        super.onProgressUpdate(values);
    }
}

doinbackgroud()寫入http請求的程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM