首页 > 代码库 > 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 启动线程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。