Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于未捕获异常而退出线程_Java_Android - Fatal编程技术网

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.
}