正确关闭MainActivity中的异常

时间:2014-05-25 11:39:54

标签: android

我是Android开发的新手,我有一个问题。 我已经在论坛上寻找这个问题,但没有运气。

我的MainActivity onCreate尝试连接到服务器。 在某些情况下,服务器可能已关闭,在这种情况下,我的应用程序抛出异常。 我该怎么做才能优雅地完成活动?

我尝试过Toast一条消息并完成()活动,但没有消息显示且活动仍在运行。

我的代码有什么问题?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            mSocket = new Socket("127.0.0.1", 6000);
            try {
                conn = new ClientConnection(mSocket.getInputStream(),mSocket.getOutputStream());
                GameSurfaceView gameSurface = (GameSurfaceView)findViewById(R.id.Game);

                conn.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



        } catch (UnknownHostException e) {
            Log.e(TAG, "Unknown Host Exception");
            e.printStackTrace();
            Toast.makeText(this, "Unknown Host Exception", Toast.LENGTH_SHORT);
            finish();

        } catch (IOException e) {
            Log.e(TAG, "IO Exception");
            Toast.makeText(this, "IO Exception", Toast.LENGTH_SHORT);
            finish();

        }
        catch (Exception e) {
            Log.e(TAG, "Exception");
            Toast.makeText(this, "IO Exception", Toast.LENGTH_SHORT);
            finish();
        }

        Log.v(TAG,"Activity created");

    }

1 个答案:

答案 0 :(得分:1)

  1. 不要在UI线程中运行网络代码。 onCreate是UI线程 - 你永远不应该在那里做任何IO,网络或其他长处理任务。请阅读http://developer.android.com/training/best-background.html了解详情。
  2. 您的toast位于out try块的catch子句中 - 但是所有IOExceptions(包括UnknownHostException)都已在内部try块中捕获。在那里你只打印堆栈跟踪。这就是为什么没有显示任何消息的原因。我认为不需要两个嵌套的try块,其中一个可能就是你所需要的。
  3. 假设你的应用程序无法在没有服务器连接的情况下运行,正确的方法是让用户知道那种情况(AlertDialog,Toast,无论如何),然后在活动上调用Finish()来关闭它。
  4. 编辑:正如已删除的答案所指出的那样,在我已经提到的内容之外,当然也需要调用show():

    Toast.makeText(this, "Unknown Host Exception", Toast.LENGTH_SHORT).show();