Android中的Android刷新TextView

时间:2013-11-15 14:12:45

标签: android android-asynctask

我知道已经有很多关于此事的讨论,但我发现的一切都无法解决我的困惑 我第一次使用Android SDK,而我的Java技能相当平均。

我有以下问题:
从我的MainActivity - OnCreate()fct。我启动一个线程(Receiver),从SocketStream接收数据。当从流中读取新数据时,该线程将刷新GUI上的TextView元素 这样做的简单但正确的方法是什么?我读了一些关于ASyncTask的内容,但是不明白如何实现它。

public class MainActivity extends Activity 
{
    ExecutorService myExecutor;

    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("this is a test"); System.out.flush();

        try 
        {
            myExecutor = Executors.newCachedThreadPool();
            myExecutor.execute(Receiver.getInstance());
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }

...

public class Receiver implements Runnable  
{  
[...]  
    public void run()  
    {  
        while (true)  
        {  
            //blocking system-io-call to read data from socket..  
            //extract information  
            // *** update textView *** ??  
        }  
    }  
}  

3 个答案:

答案 0 :(得分:2)

您可以在GUI线程中实现处理程序来更改GUI(在您的案例中为MainActivity):

public Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //refresh textview
        }
    };

而不是从另一个线程中调用它

activity.handler.sendEmptyMessage(what);

您可以为Receiver编写自己的构造函数:

public class Receiver implements Runnable  
{  
[...]  
    MainActivity activity;
    public Receiver(MainActivity activity){
        this.activity = activity;
    }  


    public void run()  
    {  
        while (true)  
        {  
            //blocking system-io-call to read data from socket..  
            //extract information  
            // *** update textView *** ??  
           activity.handler.sendEmptyMessage(0);
        }  
    }  
}  

答案 1 :(得分:2)

您可以使用runOnUiThread

public class Receiver implements Runnable  
{  
[...]  
    public void run()  
    {  
        while (true)  
        {  
            //blocking system-io-call to read data from socket..  
            //extract information  

         runOnUiThread(new Runnable() {
                public void run() {
                     // *** update textView *** ??  
                }
            });
    }  
}  
}  

答案 2 :(得分:1)

这是一个例子:

创建Counter类:

public class Counter implements Runnable
{
    private ICounterEvents listener;
    public static Thread OBJ_THREAD = null;

    public Counter()
    {       
        OBJ_THREAD = new Thread(this);          
    }

    public void setCountListener(ICounterEvents listener)
    {
        this.listener = listener;
    }

    public void start()
    {       
        OBJ_THREAD.start();
    }                       

    @Override
    public void run() 
    {
        for(int i = 0; i < 100; i++)
        {
            try 
            {
                Thread.sleep(1000);
            } 
            catch (InterruptedException e) 
            {               
                e.printStackTrace();
            }

            Message msg = Message.obtain();
            msg.obj = i;            
            this.handler.sendMessage(msg);
        }
    }

    private Handler handler = 
            new Handler()
            {
                @Override
                public void handleMessage(Message msg)
                {
                    if(Counter.this.listener != null)
                    {
                        int value = (Integer)msg.obj;
                        Counter.this.listener.countChanged(value);
                    }
                }
            };
}

并创建一个接口类:

public interface ICounterEvents 
{
    public void countChanged(int value);
}

并且在主布局中创建文本视图和按钮, 并在MainActivity中的onCreate方法中使用此代码:

public class MainActivity extends Activity implements ICounterEvents, OnClickListener
{
    private TextView txtCounter;
    private Button btnStart;
    private Counter counter;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.setupViews();
    }

    private void setupViews() 
    {
        this.counter = new Counter();
        this.counter.setCountListener(this);

        this.txtCounter = (TextView)findViewById(R.id.txtCount);
        this.btnStart = (Button)findViewById(R.id.btnStart);    

        this.btnStart.setOnClickListener(this);
    }   

    @Override
    public void onClick(View v) 
    {       
        this.counter.start();
    }

    public void countChanged(int value)
    {
        try 
        {
            this.txtCounter.setText(value + "");
        } 
        catch (Exception e) 
        {           

        }
    }   
}