Java 由于未捕获异常而退出线程
嘿 我的代码:Java 由于未捕获异常而退出线程,java,android,Java,Android,嘿 我的代码: Thread thread = new Thread (){ @Override public void run() { while (true) { Handler handler = new Handler(){ @Override
Thread thread = new Thread (){
@Override
public void run() {
while (true)
{
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.obj.toString()!= null)
{
JSONParse json = null;
try {
Log.e("Channel_State",msg.obj.toString());
json = new JSONParse(msg.obj.toString());
String state = json.getChannelState();
id = state;
TextView tv2 = (TextView)findViewById(R.id.mainscreen_state);
tv2.setText("Channel State: "+ state);
Log.e("State",state);
} catch (final Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
runOnUiThread(new Runnable() {
public void run() {
Toast toast ;
toast = Toast.makeText(getApplicationContext(), "Error" + e.getMessage(), 500);
Log.e("Error",e.getMessage());
toast.show();
}
});
}
}
else
{
runOnUiThread(new Runnable() {
public void run() {
Toast toast ;
toast = Toast.makeText(getApplicationContext(), "error", 500);
toast.show();
}
});
}
}
};
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("session_id", settings.getString("session_id","error")));
params.add(new BasicNameValuePair("channel_id",String.valueOf(settings.getInt("channel_id", -1))));
HttpConnection con = new HttpConnection(params, "http://surfkid.redio.de/getChannelImage", handler);
con.start();
try {
Log.e("Sleep","Begin");
this.sleep(5000);
Log.e("Sleep","End");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.e("Sleep","Fail");
}
}
}
};
thread.start();
Thread-Thread=新线程(){
@凌驾
公开募捐{
while(true)
{
Handler=newhandler(){
@凌驾
公共无效handleMessage(消息消息消息){
if(msg.obj.toString()!=null)
{
JSONParse json=null;
试一试{
Log.e(“Channel_State”,msg.obj.toString());
json=newJSONParse(msg.obj.toString());
String state=json.getChannelState();
id=状态;
TextView tv2=(TextView)findViewById(R.id.mainscreen\u状态);
tv2.setText(“频道状态:+状态”);
Log.e(“国家”,国家);
}捕获(最终异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
runOnUiThread(新的Runnable(){
公开募捐{
吐司;
toast=toast.makeText(getApplicationContext(),“Error”+e.getMessage(),500);
Log.e(“Error”,e.getMessage());
toast.show();
}
});
}
}
其他的
{
runOnUiThread(新的Runnable(){
公开募捐{
吐司;
toast=toast.makeText(getApplicationContext(),“error”,500);
toast.show();
}
});
}
}
};
List params=new ArrayList();
add(新的BasicNameValuePair(“会话id”,settings.getString(“会话id”,“错误”)));
params.add(新的BasicNameValuePair(“channel_id”,String.valueOf(settings.getInt(“channel_id)”,-1));
HttpConnection con=新的HttpConnection(参数)http://surfkid.redio.de/getChannelImage“,处理程序);
con.start();
试一试{
Log.e(“睡眠”、“开始”);
这个。睡眠(5000);
Log.e(“睡眠”、“结束”);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
Log.e(“睡眠”、“失败”);
}
}
}
};
thread.start();
日志:
02-10 00:01:29.044:错误/AndroidRuntime(1248):未捕获处理程序:由于未捕获异常,线程线程-13正在退出
02-10 00:01:29.054:错误/AndroidRuntime(1248):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
02-10 00:01:29.054:ERROR/AndroidRuntime(1248):位于android.os.Handler.(Handler.java:121)
02-10 00:01:29.054:ERROR/AndroidRuntime(1248):在android.skiptvad.MainScreen$6$1。(MainScreen.java:258)
02-10 00:01:29.054:ERROR/AndroidRuntime(1248):在android.skiptvad.MainScreen$6.run(MainScreen.java:258)
请帮忙 您正在工作线程中创建处理程序。你不能那样做。处理程序需要在UI线程中实例化。在实例化处理程序之前,需要在线程中启动消息泵。创建处理程序后,它将绑定到创建它的线程,您可以向它发送消息。线程的示例:
使用getHandler()将处理程序返回到您的线程,然后向其发送消息。似乎您要做的是创建一个
HandlerThread
HandlerThread myThread = new HandlerThread();
myThread.start();
Handler myHandler = new Handler(myThread.getLooper()){
//your handler code.
}
这将为您提供一个由处理程序按照您所寻找的方式处理的线程。嘿,谢谢您的帖子,我不知道HandlerThread。非常方便!
class MyThread extends Thread
{
private CountDownLatch mSync = new CountDownLatch(1);
private Handler mHandler;
public Handler getHandler()
{
try//Make sure the handler has been created.
{
mSync.await();
}
catch (InterruptedException e)
{
//Do something
}
return mHandler;
}
public void run()
{
Looper.prepare();
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
if (msg.what == one of your message)
{
//....
}
}
};
mSync.countDown();
Looper.loop();
}
}
HandlerThread myThread = new HandlerThread();
myThread.start();
Handler myHandler = new Handler(myThread.getLooper()){
//your handler code.
}