android操作ui线程
-
runOnUiThread(new Runnable() {
-
@Override
-
public void run() {
-
Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show();
-
final Timer t = new Timer();
-
t.schedule(new TimerTask() {
-
public void run() {
-
nebulaOk = 2; // 这里将状态置为2是必要的以防再请求失败时状态没有更改过来造成的不发送nebula请求
-
t.cancel();
-
}
-
}, 1000);
-
}
-
});
我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据。但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的。下面总结4中方法用来在线程中操作UI界面。
模拟耗时操作
private void connectNet() throws InterruptedException { Thread.sleep(2000); }
方法一:Handler
子线程中通过Handler的sendMessage(msg)发送事件:
private void method1() { new Thread(new Runnable() { @Override public void run() { try { //耗时操作 connectNet(); //向Handler发送消息 mHadndler.sendEmptyMessage(111); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); }
方法二:View.post(Runnable)
private void method2() { myText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { try { //耗时操作 connectNet(); myText.post(new Runnable() { @Override public void run() { myText.setText("联网结束,更新UI数据"); } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }); }
方法三:Activity.runOnUiThread
与view.post类似
private void method3() { new Thread(new Runnable() { @Override public void run() { try { //耗时操作 connectNet(); runOnUiThread(new Runnable() { @Override public void run() { myText.setText("runOnUiThread..."); } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); }
方法四:AsyncTask
private void method4() { //UI线程中执行 new LoadTask().execute("www.91dota.com"); } private class LoadTask extends AsyncTask { protected void onPostExecute(String result) { myText.setText(result); //得到来自网络的信息刷新页面 } protected String doInBackground(Object[] objects) { return "......";//后台耗时操作 } }
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/103336149
- 点赞
- 收藏
- 关注作者
评论(0)