//MainActivity.java
package com.example.multipleThread;
import com.example.sqlitedatabase.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
//主线程
public class MainActivity extends Activity {
static int num = 0;
static ChildThread myThread;
static Handler mainHandler = new Handler(){
//接收到来自子线程的message时处理方法
@Override
public void handleMessage(Message msg) {
tv.setText(msg.arg1+"");
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message threadmsg = new Message();
threadmsg.arg1 = ++num;
myThread.threadHandler.sendMessage(threadmsg);
super.handleMessage(msg);
}
};
static TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
tv = (TextView)findViewById(R.id.textView1);
myThread = new ChildThread();
myThread.run();
Message threadmsg = new Message();
threadmsg.arg1 = num;
myThread.threadHandler.sendMessage(threadmsg);
}
}
ChildThread.Java
package com.example.multipleThread;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Handler;
import android.os.Message;
public class ChildThread extends Thread {
static Handler threadHandler = new Handler(){
<pre name="code" class="java"> //接收到来自主线程的message时处理方法
@Override
public void handleMessage(Message msg) {
Message mainmsg = new Message();
mainmsg.arg1 = msg.arg1*2;
MainActivity.mainHandler.sendMessage(mainmsg);
super.handleMessage(msg);
}
};
SQLiteOpenHelper sqliteHelper;
@Override
public void run() {
super.run();
}
}
结论:handler对象是可以同时在主线程和子线程里创建的,并且可以建立正常的通信。
注意1:在线程类中创建的是静态的属性handler(当然也可以是非静态的),重点是该handler不是在run方法中创建!如果在run方法中创建的话,是需要先调用looper.prepare()方法的!
注意2:在run()方法中new出来的才与本线程的looper挂钩(前提:该线程有looper),而在run()方法之外new出来的handler其实并没有与本线程挂钩。好像是绕了一个圈圈,到头来还是在主线程里创建了handler。
所以,第一个结论是片面的。那是很早之前浅陋的认识,希望没有对你造成误解。勿喷。感谢浏览!