android多線程與介面互動以及runOnUiThread簡單應用

來源:互聯網
上載者:User

轉自:http://blog.csdn.net/keyboard_workers/article/details/7620566

首先runOnUiThread是Activity內部的方法,在運用的時候最好指明當前環境變(Context).

new Thread(new Runnable() {

   @Override
   public void run() {
    System.out.println(Thread.currentThread().getId());
    runOnUiThread(new Runnable() {

     @Override
     public void run() {
      Toast.makeText(RunOnUIThreadActivity.this, "UI操作...", 1000).show(); 
     }
    });
   }

  }).start();

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
        new Thread(new Runnable() {

      @Override
      public void run() {
       if(isClose)
        return;
       if(i!=0)
       Toast.makeText(RunOnUIThreadActivity.this, i+"", 1000).show(); 
       i++;
       handler.postDelayed(this, 2000);
      }

     }).start(); 
       }

上面兩個其實原理一樣,runOnUiThread這個會調用父類中的

public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

首先判斷是否是UI線程,不是的話就post,如果是的話就正常運行該線程.

只要經過主線程中的Handler.post或者postDelayed處理線程runnable則都可以將其轉為UI主線程.再說Handler的機制就是來處理線程與UI通訊的.



三、Android多線程與介面互動的辦法


1.Activity.runOnUIThread(Runnable)


 2.View.post(Runnable),View.postDelay(Runnable,long)


 3、Handler


 4、AsyncTask


 下面用一個工程實現了上方四種互動辦法




public class MainActivity extends Activity {  

private TextView txView;
private Button button;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i("RootyInfo", "oncreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

txView=(TextView)findViewById(R.id.textView1);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

//建立一個用於顯現前三種後台線程和UI線程互動的線程
new TestThread(MainActivity.this).start();

//建立一個用於顯現AsyncTask實現互動的TestAsyncTask
new TestAsyncTask().execute("Test"," AsyncTask");
}
});
}


class TestAsyncTask extends AsyncTask<String, Integer, String>
{
//TestAsyncTask被後台線程履行後,被UI線程被調用,一般用於初始化介面控制項,如進度條
@Override
protected void onPreute() {
// TODO Auto-generated method stub
super.onPreute();
}

//doInBackground履行完後由UI線程調用,用於更新介面操縱
@Override
protected void onPostute(String result) {
// TODO Auto-generated method stub
txView.setText(result);
super.onPostute(result);
}

//在PreExcute履行後被啟動AysncTask的後台線程調用,將成果返回給UI線程
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
StringBuffer sb=new StringBuffer();
for (String string : params) {
sb.append(string);
}
return sb.toString();
}

}
//用於線程間通訊的Handler
class TestHandler extends Handler
{

public TestHandler(Looper looper) {
super(looper);
// TODO Auto-generated constructor stub
}

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
System.out.println("123");
txView.setText((String)msg.getData().get("tag"));
super.handleMessage(msg);
}

}
//後台線程類
class TestThread extends Thread
{
Activity activity;
public TestThread(Activity activity) {

this.activity = activity;
}
@Override
public void run() {

//下面代碼用來示範Activity.runOnUIThread(Runnable)辦法的實現
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
txView.setText("Test runOnUIThread");
}
});

//下面代碼用來示範Activity.runOnUIThread(Runnable)辦法的實現
txView.post(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
txView.setText("Test View.post(Runnable)");
}
});

//下面代碼用來示範Activity.runOnUIThread(Runnable)辦法的實現
txView.postDelayed(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
txView.setText("Test View.postDelay(Runnable,long)");
}
}, 1000);

//下面代碼用來示範Handler辦法的實現
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("tag", "Test Handler");
msg.setData(bundle);
new TestHandler(Looper.getMainLooper()).sendMessage(msg);

super.run();
}

}

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.