我正面临这个问题。我希望我的主线程仅在其他线程完成执行时才恢复执行。但是我的主线程即使其他线程完成了执行也没有执行。
我的代码如下:
public class MainActivity extends ActionBarActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text_test);
TestLocalHost th = new TestLocalHost();
Thread exe = new Thread(th);
exe.start();
try {
exe.join();
}
catch (InterruptedException e){
e.printStackTrace();
}
mTextView.setText("MainThread");
}
private class TestLocalHost implements Runnable {
@Override
public void run() {
final String s = JSONParser.doGet("http://<My system ip>/GetResult.ashx?op=getInfo",null);
runOnUiThread(new Runnable() {
@Override
public void run()
{
mTextView.setText(s);
}
});
}
}
}
我使用mTextView
线程中的值设置exe
的值。我需要主线程在执行后用mTextView
覆盖"Main thread"
。我使用join()
函数来exe
线程,这将确保主线程将等待此线程完成执行。但是一旦这个线程完成了exectuion,我的主线程就没有写入mTextView
。我在做什么错误?
答案 0 :(得分:3)
这与runOnUiThread
的工作方式有关。
在android中,主线程有一个Looper
。 Looper
保持一个runnable队列,一次一个。
当你调用runOnUiThread
时,Runnable
被排入looper,意味着它将在looper运行的当前事件完成后执行,并且队列为空。
在您的情况下,当您致电onCreate
时,Looper正在执行join
。这意味着您的runOnUiThread
将在此之后入队。
在排序方面,这意味着发出以下呼叫顺序:
答案 1 :(得分:1)
&#34; 主线程没有写入mTextView
&#34;是Thread exe
比runOnUiThread()
方法开始的更早终止。由于join()
仅等待Thread exe
完成(而不是另一个),因此您可以覆盖{em>&#34; MainThread&#34; mTextView
覆盖 String s 在另一个线程上设置。
您可以查看,例如,查看Log
:
...
mTextView.setText("MainThread");
Log.d("THREAD", mTextView.getText().toString());
答案 2 :(得分:-2)
尝试使用AsyncTask。它就是为了这个目的。
private class GetDataFromNetwork extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
//Get Data using url
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
//Update UI Here. This runs on the UI Thread.
}
}