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)
小智 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)
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)
有几种使用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)
| 归档时间: |
|
| 查看次数: |
314345 次 |
| 最近记录: |