簡體   English   中英

AsyncTask工作不正確(Android)

[英]AsyncTask work not really correctly (Android)

我正在研究一些“套接字應用程序” ,我需要幫助。 我有一個連接方法的類:

public class ClientSocketConnection {

private int port = 49150;
private String host;

public ClientSocketConnection(String host){
    this.host = host;
}

public boolean connect(){
    Boolean isConnected = false;

    AsyncTask<Void, Void, Boolean> asyncProcess = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... voids) {
            try {
                Socket client = new Socket();
                client.connect(new InetSocketAddress(host, port), 1000);
            } catch (IOException ex) {
                Log.d(TAG, "Client socket exception", ex);
                return false;
            }
            return true;
        }
    };

    asyncProcess.execute();

    try {
        isConnected = asyncProcess.get();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return isConnected;
}

我正在嘗試使用Application類中的 AsyncTask建立套接字連接

private void executeRequest(){
    ClientSocketConnection client = new ClientSocketConnection(txtIPAddress.getText().toString());
    AsyncTask<Void, Void, Boolean> connectionTask = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... voids) {
            Log.d(TAG, "Begin");
            boolean flag = client.connect();
            Log.d(TAG, "End");//Not displayed
            return flag;
        }

        @Override
        protected void onPostExecute(Boolean isConnected) {
            if(isConnected){
                Toast.makeText(getApplicationContext(), "Connection established", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "Incorrect IP-Address", Toast.LENGTH_SHORT).show();
            }
        }
    };

    connectionTask.execute();
}

但是executeRequest()中的doInBackground方法不能完全工作(不顯示結束消息 )。 但是,有趣的是,當在主(UI)線程中執行它時,一切都很好而不在Application類中使用AsyncTask ...

可能是什么問題呢? 日志中沒有錯誤。 該應用程序繼續工作......


提前致謝))

因為你正在調用AsyncTask.get()。 這導致您在任務完成之前不會異步並阻塞。 永遠不應該調用該函數。 它的使用非常有限,如果你不想做一些非常不尋常的錯誤。 這里也沒有理由有2個異步任務。

這是你的第二個問題 - 2個異步任務。 AsyncTasks都共享相同的線程,並循環執行。 這意味着任務2無法在任務1完成之前執行 - 但是您有任務1等待任務2,這將永遠不會啟動。 你基本上陷入僵局。

解決方案:不要使用AsyncTask.get()。 重寫這個以使用單個AsyncTask,或者使用真正的線程(這通常適用於網絡,就像你在應用程序的其他地方使用AsyncTasks一樣,它們將被阻止等待網絡請求完成)。

暫無
暫無

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

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