设置TextView文本时应用程序冻结

时间:2018-12-30 14:36:09

标签: java android multithreading kotlin

我必须用一种方法的结果来更新另一个类(不是活动)中的TextView,这可能会很慢地完成其搜索。虽然该方法还没有完成,但我想将TextView文本设置为“正在加载...”之类的方法,最后,在方法结果确定后,将文本设置为该结果。目前,我正在执行以下操作:

textView.setText("loading...");
Search s = searcher.search();
textView.setText(s.result);

首先,一旦不使用新的Threads,它仍然冻结应用程序,直到结果确定。我知道要将内容设置为Android小部件,我们必须在uiThread内进行操作,但是一旦我不在Activity内,我就不知道如何进行操作。

第二位,该方法未显示“正在加载...”文本。当我调用该代码时,应用程序将冻结并返回最终文本。

然后,如何避免冻结/破裂,直到内容正常为止?

2 个答案:

答案 0 :(得分:1)

请勿在Android的MainThread(UI)内部进行繁重的操作。对于您的情况,请看AsyncTask。它为您提供了一种方法doInBackground,您应该在其中进行一些后台处理(http请求,文件i / o),然后您将得到调用onPostExecute,该方法将在UI Thread上调用{{ 1}}方法。 Another example

答案 1 :(得分:0)

我认为主要要理解的是,仅UI特定任务应在UI线程上运行。如果它与UI不相关,那么它最好作为AsyncTask在另一个线程上运行。

如您所指出的那样,一般来说,执行搜索的性能非常高。这将阻止UI线程更新UI,从而导致UI不响应,用户可能会认为这是崩溃或应用程序运行缓慢。

因此,首先,要在UI线程上运行更新。

runOnUiThread(() ->{textView.setText("loading...");});

然后在其他线程上执行搜索

然后,搜索完成后,使用与上述相同的方法更新用户界面