【问题标题】:How does Android UI thread work?Android UI 线程是如何工作的?
【发布时间】:2014-09-25 16:50:40
【问题描述】:

我是 Android Devloping 的初学者,我在 Android 中遇到了 UI 问题

我的代码如下所示:

public class MainActivity extends Activity{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv1 = (TextView) findViewById(R.id.textView1);
        TextView tv2 = (TextView) findViewById(R.id.textView2);

        tv1.setVisibility(View.GONE);
        tv2.setVisibility(View.GONE);

        String s="abc";
        MyAsyncTask BkGroundTask = new MyAsyncTask(); 
        BkGroundTask.execute(s);
        try {
            s = BkGroundTask.get();
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();}

        tv1.setVisibility(View.VISIBLE);
        tv2.setVisibility(View.VISIBLE);

    }
}

但 tv1 和 tv2 在 AsyncTask 运行时不会消失。 我应该怎么做才能解决这个问题?

【问题讨论】:

标签: android multithreading user-interface android-asynctask


【解决方案1】:

asynctask 异步执行,您假设当您调用 execute 时一切都会暂停,这是错误的,并且会破坏 asynctask 的目的。实际上它正在消失,然后又重新出现。它发生得如此之快,以至于您可能甚至都没有注意到它。

如果您想在任务完成时显示文本视图,您需要在任务的 onpostexecute 中执行此操作

例子

@Override
public void onPostExecute(Void void){
    tv1.setVisibility(View.VISIBLE);
    tv2.setVisibility(View.VISIBLE);
}

【讨论】:

    【解决方案2】:

    这已经讨论过很多次了,但我会再次解释你想要什么,因为你想要一个特殊的场景......

    几乎从不想使用.get(),因为它是一个阻塞调用。这意味着它将锁定您的 UI,直到任务完成。 .execute(),如你所愿,就是你想要的。

    如果您希望它们在任务运行时消失并在任务完成时再次可见,那么您希望将代码显示在 onPostExecute() 中,如果它是内部类,如果不是,那么您可以使用从onPostExecute()Activity 的回调并在回调方法中显示它们。

    This answer discusses how to use an interface with your AsyncTask

    Related Post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多