异步任务上 TextView 的 setText 完成

setText of TextView on Async Task complete

我想 return 在我的 android 应用程序中使用 ksoap2 网络服务的特定字符串。

Web 服务正在 return 获取正确的值,但一旦任务完成,设置的文本就不会更新。我需要做一些事情(比如尝试打开导航抽屉)然后更新它。有什么想法吗??

我的代码如下

// Calling the async class

protected void onResume() {
            try {
                super.onResume();
                new RetrieveTimeWS().execute();
            }
            catch (Exception e)
            {
                Log.e("Current Time", e.getMessage());
            }
        }

以下是异步任务

class RetrieveTimeWS extends AsyncTask<Void, Void, String> {

        protected String doInBackground(Void... params) {
            String datetime = "";
            try {

                TextView TVcurrentTime = (TextView) findViewById(R.id.DateTimeNow);

                TVcurrentTime.setText("Loading...");
                datetime = getDateTimeClass.getDateTime();
                TVcurrentTime.setText(datetime);

            } catch (Exception e) {
                Log.e("Async Task - GetDateTime ", e.getMessage());
            }
            return datetime;
        }
    }

只有当我触摸屏幕上的任何组件时,文本字段才会显示 "Loading..."。如何在 Web 服务 returns 文本后将文本视图更改为所需的字符串。

提前致谢。

拉克斯。

您不能与 UI 交互,而不是来自 UI 线程。 AsyncTask 具有从 UI 线程调用的 onPreExecute 和 PostExecute 方法,您可以在其中更改 UI。

class RetrieveTimeWS extends AsyncTask<Void, Void, String> {

    TextView TVcurrentTime = (TextView) findViewById(R.id.DateTimeNow);

    Exception e;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();        
        TVcurrentTime.setText("Loading...");
    }

    protected String doInBackground(Void... params) {
        String datetime = "";
        try {           
            datetime = getDateTimeClass.getDateTime();
        } catch (Exception e) {
            this.e = e;
            Log.e("Async Task - GetDateTime ", e.getMessage());
        }
        return datetime;
    }

    @Override
    protected void onPostExecute(final String s) {
        super.onPostExecute(s);

        if (e != null) {
            TVcurrentTime.setText(s);
        }
    }
}

您不能在后台线程中执行任何 UI 工作。在 onPostExecute() 方法中执行。 此方法在主线程上运行。所以,你可以在这个方法中设置文本。