我完全是Android的新手,只是想知道它是否是任何工作和可能的方式来更新主线程之外的UI。只是从我下面列出的代码中我知道这个代码;根本不可能。但是,事情是我只想使用另一个线程来更新UI。请提前帮助我!
package com.example.app;
import java.util.Random;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button b;
public ImageView I1;
public ImageView I2;
public ImageView I3;
public ImageView I4;
public TextView T;
public TextView s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
I1=new ImageView(this);
I1=(ImageView) findViewById(R.id.imag1);
I1.setVisibility(View.INVISIBLE);
I2=new ImageView(this);
I2=(ImageView) findViewById(R.id.imag2);
I2.setVisibility(View.INVISIBLE);
I3=new ImageView(this);
I3=(ImageView) findViewById(R.id.imag3);
I3.setVisibility(View.INVISIBLE);
I4=new ImageView(this);
I4=(ImageView) findViewById(R.id.imag4);
I4.setVisibility(View.INVISIBLE);
T=(TextView)findViewById(R.id.time);
s=(TextView)findViewById(R.id.score);
Thread t=new Thread(new MyThread());
t.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class MyThread implements Runnable{
Random randomGenerator = new Random();
int n;
public void run(){
while(true){
n=randomGenerator.nextInt(8);
if(n==1){
I1.setVisibility(View.VISIBLE);
}
if(n==2){
I2.setVisibility(View.VISIBLE);
}
if(n==3){
I3.setVisibility(View.VISIBLE);
}
if(n==4){
I4.setVisibility(View.VISIBLE);
}
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.getStackTrace();
}
}
}
}
}
答案 0 :(得分:4)
使用activity.runOnUiThread
Acivity.runOnUiThread(new Runnable() {
public void run() {
//something here
}
});
答案 1 :(得分:2)
您无法直接从非UI线程更新UI,但您可以使用Handler对象或AsyncTask对象与UI线程进行通信。使用AsyncTask最方便的方法:
很抱歉,方法名称有些错误。 请阅读http://developer.android.com/guide/components/processes-and-threads.html了解详情。
答案 2 :(得分:1)
工作线程永远不能更新主线程,因为只有主线程可以呈现UI元素(TextView,EditText等),如果我们尝试更新,肯定会发生异常。
myAcitity.runOnUiThread(new Runnable() {
public void run() {
//here you can update your UI elements because this code is going to executed by main thread
}
});
否则您可以使用View类的post方法
myView.post(new Runnable() {
public void run() {
//here you can update your UI elements because this code is going to executed by main thread
}
});
答案 3 :(得分:0)
只有主线程可以更新UI。如果您的线程想要更新UI,请使用activity.runOnUiThread()
但是你的行动只是排队在UI线程中运行(如果你不是从UI线程运行它),这意味着它可以稍后更新UI。
http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)
答案 4 :(得分:0)
您必须使用Handler实例并使用post方法在UI Thread的队列中添加Runnable。如果你在一个Activity中,你可以使用runOnUiThread这是一个“快捷方式”来做同样的事情