[英]Android - Using Callable for networking
我正在構建一個請求服務器溫度的應用程序。 按下按鈕時,我希望該應用程序:
1)顯示“聯系服務器”消息並顯示旋轉進度條。
2)在新線程上聯系服務器。
3)顯示結果並隱藏進度條。
這是我的MainActivity:
public class MainActivity extends AppCompatActivity {
private Button mFetchTempButton;
private TextView mResultTextView;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultTextView = (TextView) findViewById(R.id.result_textview);
mFetchTempButton = (Button) findViewById(R.id.fetch_temperature_button);
mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
mFetchTempButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mResultTextView.setText("Contacting server... ");
mProgressBar.setVisibility(View.VISIBLE);
String[] args = {};
String temperature = RequestServerTemp.main(args);
mProgressBar.setVisibility(View.INVISIBLE);
mResultTextView.setText("Server temperature is " + temperature);
}
});
}
}
這將調用java類'RequestServerTemp',它使用Callable在新線程上發出服務器請求:
public class RequestServerTemp {
public static String main(String[] args) {
final ExecutorService service;
final Future<String> task;
String result = "";
service = Executors.newFixedThreadPool(1);
task = service.submit(new GetTemp());
try {
result = task.get();
}
catch(InterruptedException | ExecutionException ex) {
ex.getMessage();
}
service.shutdownNow();
return result;
}
}
class GetTemp implements Callable<String> {
public String call() {
// simulate a long networking operation
try {
Thread.sleep(3*1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
return "30 degrees C";
}
}
這導致的錯誤是應用程序僅在整個onClick完成后才更新。 這可以防止我發生所需的步驟1)。 我是Android新手,這為我提出了幾個問題:
1)為什么onClick會在最后執行,而不像逐行執行的傳統腳本語言?
2)如果我在新線程中啟動了RequestServerTemp,為什么MainActivity會等待它完成? 我覺得這對應用程序來說很糟糕,這樣的延遲是我們在新線程中啟動網絡的全部原因。
3)幾個類似的問題說AsyncTask是處理網絡的“正確”方式,而不是Runnable或Thread。 這是真的,我應該避免在應用程序中使用Runnable和Thread嗎?
我對問題3最感興趣,因為許多stackoverflow答案指向使用Runnable和Thread技術來完成網絡,現在我在這里我擔心我浪費了大量的時間和精力。 感謝您閱讀,歡迎任何針對新應用開發者(或stackoverflow用戶!)的一般提示和建議。
result = task.get();
get()
是一種阻塞方法。 它等待直到T
可以返回。 這就是“MainActivity等待它完成”的原因。
這是真的,我應該避免在應用程序中使用Runnable和Thread嗎?
不它不是。 當我不被允許使用第三方庫向Web服務發送請求時,我使用ExecutorService
。
為什么onClick會在最后執行,而不像逐行執行的傳統腳本語言?
它不會在最后執行。 您正在為mFetchTempButton
提供委托,回調中的代碼onClick
將在單擊事件發生時執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.