码迷,mamicode.com
首页 > 移动开发 > 详细

Android 启动线程

时间:2014-10-18 23:41:33      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:android   io   os   ar   java   for   sp   on   art   

============问题描述============


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 启动线程

标签:android   io   os   ar   java   for   sp   on   art   

原文地址:http://www.cnblogs.com/lengyanyue39/p/4033849.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!