我必须用一种方法的结果来更新另一个类(不是活动)中的TextView
,这可能会很慢地完成其搜索。虽然该方法还没有完成,但我想将TextView
文本设置为“正在加载...”之类的方法,最后,在方法结果确定后,将文本设置为该结果。目前,我正在执行以下操作:
textView.setText("loading...");
Search s = searcher.search();
textView.setText(s.result);
首先,一旦不使用新的Threads
,它仍然冻结应用程序,直到结果确定。我知道要将内容设置为Android小部件,我们必须在uiThread
内进行操作,但是一旦我不在Activity
内,我就不知道如何进行操作。
第二位,该方法未显示“正在加载...”文本。当我调用该代码时,应用程序将冻结并返回最终文本。
然后,如何避免冻结/破裂,直到内容正常为止?
答案 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...");});
然后在其他线程上执行搜索
然后,搜索完成后,使用与上述相同的方法更新用户界面