Android 启动线程,该如何处理

Android 启动线程
private int i = 0;
private int x = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_world_layout);
 
Button b = (Button) findViewById(R.id.button);
final TextView v2 = (TextView) findViewById(R.id.t2);
new Thread() {
public void run() {

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
v2.setText(x++ + "");
};

}.start();



初学者  写了一个线程  。这样会出错,求解
------解决思路----------------------
setText 需要对 view 重新绘制,显示文本 而在 android 里对 view 重新进行绘制的话,需要在主线程中调用,或者使消息进入 Looper 队列
------解决思路----------------------
UI控件的函数setText只能在UI线程里调用,否则会导致异常。
可以用AsyncTask来处理。
------解决思路----------------------
示例代码

public class MainActivity extends Activity {

private Button incButton;
private TextView msgTextView;
private int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

msgTextView = (TextView)findViewById(R.id.msgTextView);
incButton = (Button)findViewById(R.id.incButton);
incButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AsyncTask<Void, Void, String> thread = new AsyncTask<Void, Void, String>() {
@Override
public String doInBackground(Void... params) {
count++;
return String.format("%d", count);
}
@Override
public void onPostExecute(String msg) {
msgTextView.setText(msg);
}
};
thread.execute();
}
});
}
}

------解决思路----------------------
或者把线程封装成一个内部类,这样代码就会写得更简洁优雅:

public class MainActivity extends Activity {

private Button incButton;
private TextView msgTextView;
private int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

msgTextView = (TextView)findViewById(R.id.msgTextView);
incButton = (Button)findViewById(R.id.incButton);
incButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyTask().execute();
}
});
}

private class MyTask extends AsyncTask<Void, Void, String> {
@Override
public String doInBackground(Void... params) {
count++;
return String.format("%d", count);
}
@Override
public void onPostExecute(String msg) {
msgTextView.setText(msg);
}
}
}