首页 > 代码库 > 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();



初学者  写了一个线程  。这样会出错,求解

============解决方案1============


setText 需要对 view 重新绘制,显示文本 而在 android 里对 view 重新进行绘制的话,需要在主线程中调用,或者使消息进入 Looper 队列

============解决方案2============


UI控件的函数setText只能在UI线程里调用,否则会导致异常。
可以用AsyncTask来处理。

============解决方案3============


示例代码
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();
			}
		});
	}
}

============解决方案4============


或者把线程封装成一个内部类,这样代码就会写得更简洁优雅:
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);
		}
	}
}

Android 启动线程