安卓 非同步線程更新Ui

來源:互聯網
上載者:User

標籤:

非同步跟新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

最後一篇講了名詞:介面對象???不懂。。。。

 

安卓 非同步線程更新Ui

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.