我们如何在Android中使用runOnUiThread?

use*_*280 149 android ui-thread

我是Android新手,我正在尝试使用UI-Thread,所以我写了一个简单的测试活动.但我认为我误解了一些东西,因为点击按钮 - 应用程序不再响应

public class TestActivity extends Activity {

    Button btn;
    int i = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runThread();
            }
        });
    }

    private void runThread(){
        runOnUiThread (new Thread(new Runnable() {  
            public void run() {
                while(i++ < 1000){
                    btn.setText("#"+i);
                    try {
                        Thread.sleep(300);
                    } 
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
             }
        }));
    }
}
Run Code Online (Sandbox Code Playgroud)

Vip*_*hah 195

下面是更正的runThread功能片段.

private void runThread() {

    new Thread() {
        public void run() {
            while (i++ < 1000) {
                try {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            btn.setText("#" + i);
                        }
                    });
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}
Run Code Online (Sandbox Code Playgroud)

  • @Nick:垃圾收集器也监视堆栈,即当线程运行时,它不会得到GC. (14认同)

小智 84

只需将其作为函数包装,然后从后台线程调用此函数.

public void debugMsg(String msg) {
    final String str = msg;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mInfo.setText(str);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 因展示如何访问外部范围的数据而被赞扬(“最终”) (3认同)

Gra*_*and 26

你有它从前到后.您的按钮单击会导致调用runOnUiThread(),但这不是必需的,因为单击处理程序已在UI线程上运行.然后,您的代码runOnUiThread()将启动一个新的后台线程,您尝试执行UI操作,然后失败.

相反,只需直接从您的点击处理程序启动后台线程.然后,将调用包装到调用btn.setText()内部runOnUiThread().


Ter*_*ogy 12

runOnUiThread(new Runnable() {
                public void run() {
                //Do something on UiThread
            }
        });
Run Code Online (Sandbox Code Playgroud)


Shi*_*dav 11

如果在片段中使用,那么只需写

getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Do something on UiThread
    }
});
Run Code Online (Sandbox Code Playgroud)


Baj*_*dda 9

有几种使用runOnUiThread()的技术,让我们看看所有

这是我的主线程(UI线程),名为AndroidBasicThreadActivity,我将以各种方式从工作线程更新它 -

public class AndroidBasicThreadActivity extends AppCompatActivity
{
    public static TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_basic_thread);

        textView = (TextView) findViewById(R.id.textview);

        MyAndroidThread myTask = new MyAndroidThread(AndroidBasicThreadActivity.this);
        Thread t1 = new Thread(myTask, "Bajrang");
        t1.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

1.)通过将Activity的实例作为工作线程的参数传递

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
    public void run()
    {

        //perform heavy task here and finally update the UI with result this way - 
        activity.runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

2.)在工作线程中使用View的post(Runnable runnable)方法

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
    public void run()
    {
     //perform heavy task here and finally update the UI with result this way - 
       AndroidBasicThreadActivity.textView.post(new Runnable()
      { 
        @Override
        public void run()
        {
            AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
        }
    });

    }
}
Run Code Online (Sandbox Code Playgroud)

3.)通过使用android.os包中的Handler类 如果我们没有上下文(this/getApplicationContext())或Activity的实例(AndroidBasicThreadActivity.this)那么我们必须使用如下的Handler类 -

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
   public void run()
  {
  //perform heavy task here and finally update the UI with result this way - 
  new Handler(Looper.getMainLooper()).post(new Runnable() {
        public void run() {
            AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
        }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)