安卓 异步线程更新Ui

异步跟新UI:

1、handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构造方法里接收handler参数,然后执行完耗时操作后,通过handler发送消息来通知主UI线程更新UI

2、接口回调,定义一个接口,然后在主UI执行耗时操作的时候,借助匿名内部类,在这里写异步线程返回来的数据处理操作,异步线程接收一个匿名的内部类实例,然后在执行完耗时操作后回调接口的方法,可以把耗时的操作的结果返回给回调函数

1的代码实现:

package com.example.testtesttest;

import org.json.JSONArray;

import com.example.testtesttest.DataRunnable.dataCallBackLisener;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements android.view.View.OnClickListener{

        private Button button = null;
        private dataCallBackLisener callbackListener ;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button:

            DataRunnable runnable = new DataRunnable(handler);
            Thread thread = new Thread(runnable);
            thread.start();

        break;
        default:
        break;
        }
        }

        public Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case 1:
                    button.setText("hhh");
                    break;

                default:
                    break;
                }
            };
        };

}
package com.example.testtesttest;

import android.os.Handler;

public class DataRunnable implements Runnable{
    private String[] dataString = new String[5];
    private dataCallBackLisener listener;
    private Handler dataHandler;
    public DataRunnable(dataCallBackLisener alistener){
        this.listener =alistener;
    }
    public DataRunnable(Handler aHandler){
        this.dataHandler =aHandler;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i =0 ; i <5;i++)
        {
            dataString[i] = i+"";
        }
        dataHandler.sendEmptyMessage(1);
        //listener.dataCallback(dataString);
    }
    public interface dataCallBackLisener{
        public void dataCallback(String[] str);
    }
}

2的代码实现:

package com.example.testtesttest;

import org.json.JSONArray;

import com.example.testtesttest.DataRunnable.dataCallBackLisener;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements android.view.View.OnClickListener{

        private Button button = null;
        private dataCallBackLisener callbackListener ;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
/*        JSONArray json = new JSONArray();
        for(int i =0 ; i<4 ; i++){
            json.put(i);
        }

        String[] a = {"1","2","3"};
        Log.e("Loooooooooook",a.toString());*/
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button:

            DataRunnable runnable = new DataRunnable(new dataCallBackLisener() {

                @Override
                public void dataCallback(String str) {
                    // TODO Auto-generated method stub
                    Log.e("hahahaahahahah", str.toString());
                    button.setText(str.toString()); //更新UI
                }
            });
            runOnUiThread(runnable);
            /*DataRunnable runnable = new DataRunnable(handler);
            Thread thread = new Thread(runnable);
            thread.start();*/
        /*AnotherFragment fragment = new AnotherFragment();
        android.app.FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.
        beginTransaction();
        transaction.replace(R.id.right_layout, fragment);
        transaction.commit();*/

        break;
        default:
        break;
        }
        }

        public Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case 1:
                    button.setText("hhh");
                    break;

                default:
                    break;
                }
            };
        };

}
package com.example.testtesttest;

import android.os.Handler;

public class DataRunnable implements Runnable{
    private StringBuilder dataString = new StringBuilder();
    private dataCallBackLisener listener;
    private Handler dataHandler;
    public DataRunnable(dataCallBackLisener alistener){
        this.listener =alistener;
    }
    public DataRunnable(Handler aHandler){
        this.dataHandler =aHandler;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i =0 ; i <5;i++)
        {
            dataString.append(i);
        }
        //dataHandler.sendEmptyMessage(1);
        listener.dataCallback(dataString.toString());
    }
    public interface dataCallBackLisener{
        public void dataCallback(String str);
    }
}

注意2中,thread必须是UIthread,这样才能更新主UI的控件

最后对回调函数的理解博客

http://www.zhihu.com/question/19801131

http://www.jianshu.com/p/cd35ce823602

http://www.bkjia.com/Androidjc/853632.html

最后一篇讲了名词:接口对象???不懂。。。。

时间: 2024-08-05 19:02:17

安卓 异步线程更新Ui的相关文章

Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面: 即如何使用Thread+Handler的方式从非UI线程发送界面更新消息到UI线程. 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),

Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Looper+MessageQueue深入详解Android异步处理四:AsyncTask的实现原理 Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainTh

android中子线程更新UI的方式浅析

一.为何写作此文 ??你是不是经常看到很多书籍中说:不能在子线程中操作ui,不然会报错.你是不是也遇到了如下的疑惑(见下面的代码): @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); Threa

Android子线程更新UI主线程方法之Handler

背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de

C#子线程更新UI控件的方法总结

http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现“从不是创建控件的线程访问它”的异常提示. 跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更新 1.使用控件自身的invoke/BeginIn

学习通过Thread+Handler实现非UI线程更新UI组件

[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件 当一个程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理.所以主线程通常又被叫做UI线程 [H

C# Winform 跨线程更新UI控件常用方法总结(转)

出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种: 1. 通过UI线程的SynchronizationContext的Post/Send方法更新: 2. 通过UI控件的Invoke/BegainInvoke方法更新: 3. 通过BackgroundWorker取代Thre

学习通过Thread+Handler实现非UI线程更新UI组件(转)

[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件 当一个程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理.所以主线程通常又被叫做UI线程 [H

C# Winform 跨线程更新UI控件常用方法汇总

C# Winform 跨线程更新UI控件常用方法汇总 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. 通过UI线程的SynchronizationContext的Post/Send方法更新:2. 通过UI控件的Invoke/BeginInvoke方法更新: 3. 通过BackgroundWorker取代Thread执行异步操作:4. 通过设置窗体