Async Task上的TextView的setText完成

时间:2015-02-06 13:26:38

标签: android android-asynctask textview

我想在我的Android应用程序中使用kso​​ap2 web服务返回一个特定的字符串。

Web服务返回正确的值,但一旦任务完成,设置文本就不会更新。我需要做一些事情(比如试图打开导航抽屉)然后它会更新。任何想法??

我的代码如下

// 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;
        }
    }

文本字段显示&#34;正在加载...&#34;直到我触摸屏幕上的任何组件。在Web服务返回文本后,如何将textview更改为所需的字符串。

提前致谢。

LAKS。

2 个答案:

答案 0 :(得分:3)

您无法与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);
        }
    }
}

答案 1 :(得分:0)

您无法在后台线程中执行任何UI工作。在onPostExecute()方法中执行此操作。 此方法在主线程上运行。因此,您可以在此方法中设置文本。