更新主线程外部的UI

时间:2013-05-10 13:29:16

标签: java android multithreading user-interface

我完全是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();
        }
    }

   }




   }
   }

5 个答案:

答案 0 :(得分:4)

使用activity.runOnUiThread

Acivity.runOnUiThread(new Runnable() {
    public void run() {
        //something here
    }
});

答案 1 :(得分:2)

您无法直接从非UI线程更新UI,但您可以使用Handler对象或AsyncTask对象与UI线程进行通信。使用AsyncTask最方便的方法:

  1. .doInBackground()方法的AsyncTask在非ui线程中运行
  2. .onProgressUpdate()在UI线程中运行,因此可以更改视图
  3. 您可以在doInBackground()中使用publishProgress()方法将数据传递给.onProgressUpdate。
  4. 很抱歉,方法名称有些错误。 请阅读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这是一个“快捷方式”来做同样的事情