2012-12-28 87 views
0

我正嘗試連接到本地網絡中的主機。從我的電腦或我的android手機(SGS2)到達它的作品,它似乎也適用於我的應用程序,但我想得到一個結果來檢查它是否工作,並取決於進行進一步的行動。如何從ASyncTask獲取結果?

我正在使用名爲Connector的ASyncTask實現。 當我調用連接器時,我不僅調用execute而且還調用get()以獲得表示成功的布爾值。這裏的問題是執行效果很好(主機肯定已經到達,我在doInBackground的斷點處着陸)

但是我怎樣才能接收到我在doInBackground中返回的布爾值? 當我調用get()時,它永遠不會完成...

基本上,我關心的是變量「連接」,但get()似乎永遠運行! 權限是在清單中授予的,我的手機上的wifi已啓用並能正常工作,我可以達到主機

這是我執行的地方連接器:

url = new URL("http://192.168.2.103/?LED=T"); 
      Connector connector = new Connector(); 
      AsyncTask<URL, Integer, Boolean> execute = connector 
        .execute(url); 
      Status status = execute.getStatus(); 
      boolean connected = false; 
      try { 
       Log.d("MainActivity", "trying to get result"); 
       connected = connector.get(); 
       Log.d("MainActivity", "got result"); 
      } catch (InterruptedException ie) { 
       ie.printStackTrace(); 
      } catch (ExecutionException ee) { 
       ee.printStackTrace(); 
      } 
      System.out.println(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
     //do something depending on connected 

這是連接器:

public class Connector extends AsyncTask<URL, Integer, Boolean> { 

public static boolean connect(URL url) { 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(url.toString()); 
    System.out.println(); 

    try { 
     HttpResponse response = httpclient.execute(httppost); 
     int statusCode = response.getStatusLine().getStatusCode(); 
     Log.d("myapp", "response " + response.getEntity()); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 

    return true; 
} 

@Override 
protected Boolean doInBackground(URL... params) { 
    boolean connect = connect(params[0]); 

    return connect; 
} 

@Override 
protected void onPostExecute(Boolean result) { 
    Log.d("Connector", "onPostExecute"); 
    super.onPostExecute(result); 
} 

}

+1

使用'AsyncTask'的'get()'方法是毫無意義的。它將異步操作轉換爲同步操作,並基本阻止您調用它的線程。如果這是來自「Activity」,這將阻止主(UI)線程,並且會導致構建UI時的問題(取決於您從哪裏調用它),並且可能會導致ANR情況。你應該讓你的'AsyncTask'成爲你的'Activity'的內部類,就像codeMagic所建議的那樣,你可以從AsyncTask的'onPostExecute(...)'方法中操作UI組件。 – Squonk

回答

1

要撥打get()因爲你已經與​​運行的AsyncTask我不認爲。如果您只想看到連接變量正在設置,請在onPostExecute()中使用Lof,因爲doInBackground的結果已發送給它。如果您需要使用它,那麼您可以使用onPostExecute()以及

+0

我需要「連接」,我調用connector.execute(),因爲根據其狀態,我想打印消息給用戶或更改按鈕圖標等 – bogus

+0

如果您的Async是您的調用類的內部類,並且連接是在主類中的字段變量,那麼你將可以在你的異步訪問它。否則,你可以在你的調用類中調用一個方法,通過'onPostExecute()'onPostExecute()' – codeMagic

+0

設置該變量,我認爲這樣做有點猶豫,因爲從一個OOP角度來看,因爲字段不是活動的特徵,這是Connector的一個屬性。但是,這絕對有效。謝謝 – bogus