我正嘗試連接到本地網絡中的主機。從我的電腦或我的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);
}
}
使用'AsyncTask'的'get()'方法是毫無意義的。它將異步操作轉換爲同步操作,並基本阻止您調用它的線程。如果這是來自「Activity」,這將阻止主(UI)線程,並且會導致構建UI時的問題(取決於您從哪裏調用它),並且可能會導致ANR情況。你應該讓你的'AsyncTask'成爲你的'Activity'的內部類,就像codeMagic所建議的那樣,你可以從AsyncTask的'onPostExecute(...)'方法中操作UI組件。 – Squonk