android在工作线程中处理UI线程报错:Only the original thread that created a view hierarchy can touch its views.

解决办法:异步更新UI

android要求只能在UI线程中更新UI,要想在其他线程中更新UI,就需要异步来处理。

Android异步更新UI的四种方式:

1.使用Handler消息传递机制;
2.使用AsyncTask异步任务;
3.使用runOnUiThread(action)方法;
4.使用Handler的post(Runnabel r)方法;
下面分别使用四种方式来更新一个TextView。

1.使用Handler消息传递机制(非常经典)

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.TextView; 
public class MainActivity extends Activity { 
private TextView tv; 
//创建handler
Handler handler = new Handler() 
{ 
  public void handleMessage(android.os.Message msg) { 
   if(msg.what==0) //如果消息是刚才发送的标识
   { 
    tv.setText("接收到handler发过来的消息进行UI更新"); 
   } 
  }; 
}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  tv = (TextView) findViewById(R.id.tv); 
  new MyThread().start(); 
} 
class MyThread extends Thread 
{ 
  @Override 
  public void run() { 
   //延迟两秒更新 
   try { 
    Thread.sleep(2000); 
   } catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
   handler.sendEmptyMessage(0); //工作线程的handler发送消息
  } 
} 
} 

2. 使用AsyncTask异步任务
注:更新UI的操作只能在onPostExecute(String result)方法中。

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.TextView; 
public class MainActivity extends Activity { 
private TextView tv; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  tv = (TextView) findViewById(R.id.tv); 
  new MyAsyncTask().execute(); 
} 


class MyAsyncTask extends AsyncTask<String, String, String> 
{ 
  @Override 
  protected String doInBackground(String... params) { 
   try { 
    Thread.sleep(2000); //睡2秒
   } catch (InterruptedException e) { 
    e.printStackTrace(); 
   } 
   return null; 
  } 
  @Override 
  protected void onPostExecute(String result) { 
   // TODO Auto-generated method stub 
   tv.setText("异步更新TextView内容"); 
  } 
} 
} 

3. 使用runOnUiThread(action)方法(最简单的方法)

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
public class MainActivity extends Activity { 
private TextView tv; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  tv = (TextView) findViewById(R.id.tv); 
  new MyThread().start(); 
} 
class MyThread extends Thread 
{ 
  @Override 
  public void run() { 
   runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
      try { 
       //延迟两秒更新 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      tv.setText("在UI线程更新TextView内容"); 
    } 
   }); 
  } 
} 
} 

4. 使用Handler的post(Runnabel r)方法

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.TextView; 
public class MainActivity extends Activity { 
private TextView tv; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  tv = (TextView) findViewById(R.id.tv); 
  Handler handler = new Handler(); 
  handler.post(new Runnable(){ 
   @Override 
   public void run() { 
    try { 
     //延迟两秒更新 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    tv.setText("异步更新TextView内容"); 
   } 
  }); 
} 
} 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值