直接上源码package com.work;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class Handler2Activity extends Activity {
private Button but1;
private Button but2;
private Button but3;
private TextView text;
private MyHandler myHandler;
private Message msg;
// private HandlerThread mHandlerThread;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// HandlerThread mHandler_Thread=new HandlerThread("mHandler_Thread");
// mHandler_Thread.start();
// myHandler=new MyHandler(mHandler_Thread.getLooper());
// Message msg=myHandler.obtainMessage();
// msg.what=0;
// msg.sendToTarget();
but1=(Button)findViewById(R.id.but1);
but2=(Button)findViewById(R.id.but2);
but3=(Button)findViewById(R.id.but3);
text=(TextView)findViewById(R.id.text);
text.setText("0");
but1.setOnClickListener(click);
but2.setOnClickListener(click);
but3.setOnClickListener(click);
}
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
// Bundle bundle=msg.getData();
// msg.what=bundle.getInt("send");
switch (msg.what) {
case 0:
int i=Integer.parseInt(text.getText().toString());
i++;
Integer a=new Integer(i);
String str=a.toString();
text.setText(str); //问题!?
// msg=myHandler.obtainMessage(0);
// msg.sendToTarget();
// myHandler.sendEmptyMessageDelayed(0, 0);
break; default:
break;
}
}
}
protected OnClickListener click=new OnClickListener() {
@Override
public void onClick(View v) {
Button but=(Button)v;
switch (but.getId()) {
case R.id.but1:
// myHandler.sendEmptyMessage(0);
HandlerThread mHandlerThread=new HandlerThread("mHandlerThread");
mHandlerThread.start();
myHandler=new MyHandler(mHandlerThread.getLooper());
msg=myHandler.obtainMessage(0);
// Bundle bundle=new Bundle();
// bundle.putString("send", "0");
//
//
// msg.setData(bundle);
msg.sendToTarget();
break;
case R.id.but2:
myHandler.removeMessages(0);
break;
case R.id.but3:
text.setText("0");
myHandler.removeMessages(0);
break;
default:
break;
}
}
};
}
XML<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/text"
android:textSize="30sp"
android:gravity="right"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/but1"
android:text="@string/start"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/but2"
android:text="@string/end"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/but3"
android:text="@string/chongzhi"
/>
</LinearLayout>
错误信息:
02-01 17:32:34.637: E/AndroidRuntime(9632): FATAL EXCEPTION: mHandlerThread
02-01 17:32:34.637: E/AndroidRuntime(9632): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.View.invalidate(View.java:5139)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.checkForRelayout(TextView.java:5364)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.setText(TextView.java:2688)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.setText(TextView.java:2556)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.setText(TextView.java:2531)
02-01 17:32:34.637: E/AndroidRuntime(9632): at com.work.Handler2Activity$MyHandler.handleMessage(Handler2Activity.java:66)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.os.Looper.loop(Looper.java:123)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.os.HandlerThread.run(HandlerThread.java:60)
求各位大牛给予解答。PS:我知道它的意思是不能在UI线程中做复杂的事,但是我用了HandlerThread来处理的啊?
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class Handler2Activity extends Activity {
private Button but1;
private Button but2;
private Button but3;
private TextView text;
private MyHandler myHandler;
private Message msg;
// private HandlerThread mHandlerThread;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// HandlerThread mHandler_Thread=new HandlerThread("mHandler_Thread");
// mHandler_Thread.start();
// myHandler=new MyHandler(mHandler_Thread.getLooper());
// Message msg=myHandler.obtainMessage();
// msg.what=0;
// msg.sendToTarget();
but1=(Button)findViewById(R.id.but1);
but2=(Button)findViewById(R.id.but2);
but3=(Button)findViewById(R.id.but3);
text=(TextView)findViewById(R.id.text);
text.setText("0");
but1.setOnClickListener(click);
but2.setOnClickListener(click);
but3.setOnClickListener(click);
}
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
// Bundle bundle=msg.getData();
// msg.what=bundle.getInt("send");
switch (msg.what) {
case 0:
int i=Integer.parseInt(text.getText().toString());
i++;
Integer a=new Integer(i);
String str=a.toString();
text.setText(str); //问题!?
// msg=myHandler.obtainMessage(0);
// msg.sendToTarget();
// myHandler.sendEmptyMessageDelayed(0, 0);
break; default:
break;
}
}
}
protected OnClickListener click=new OnClickListener() {
@Override
public void onClick(View v) {
Button but=(Button)v;
switch (but.getId()) {
case R.id.but1:
// myHandler.sendEmptyMessage(0);
HandlerThread mHandlerThread=new HandlerThread("mHandlerThread");
mHandlerThread.start();
myHandler=new MyHandler(mHandlerThread.getLooper());
msg=myHandler.obtainMessage(0);
// Bundle bundle=new Bundle();
// bundle.putString("send", "0");
//
//
// msg.setData(bundle);
msg.sendToTarget();
break;
case R.id.but2:
myHandler.removeMessages(0);
break;
case R.id.but3:
text.setText("0");
myHandler.removeMessages(0);
break;
default:
break;
}
}
};
}
XML<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/text"
android:textSize="30sp"
android:gravity="right"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/but1"
android:text="@string/start"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/but2"
android:text="@string/end"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/but3"
android:text="@string/chongzhi"
/>
</LinearLayout>
错误信息:
02-01 17:32:34.637: E/AndroidRuntime(9632): FATAL EXCEPTION: mHandlerThread
02-01 17:32:34.637: E/AndroidRuntime(9632): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.view.View.invalidate(View.java:5139)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.checkForRelayout(TextView.java:5364)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.setText(TextView.java:2688)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.setText(TextView.java:2556)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.widget.TextView.setText(TextView.java:2531)
02-01 17:32:34.637: E/AndroidRuntime(9632): at com.work.Handler2Activity$MyHandler.handleMessage(Handler2Activity.java:66)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.os.Looper.loop(Looper.java:123)
02-01 17:32:34.637: E/AndroidRuntime(9632): at android.os.HandlerThread.run(HandlerThread.java:60)
求各位大牛给予解答。PS:我知道它的意思是不能在UI线程中做复杂的事,但是我用了HandlerThread来处理的啊?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货