簡體   English   中英

Android - 使用Callable進行網絡連接

[英]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.

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