【问题标题】:Android: force a thread to close and display an alert dialogAndroid:强制线程关闭并显示警报对话框
【发布时间】:2012-12-15 00:19:59
【问题描述】:

我有一个线程,我在其中捕获了一个异常。我想要的是,当这种情况发生时,线程关闭/退出/死亡或我应该说的任何内容,并显示一个警报对话框(不像敬酒!)。

这是我的代码:

    t1 = new Thread(new Runnable()
    {   
        public void run() 
        {
            Looper.prepare();
            StringBuffer stringBuffer = new StringBuffer("");
            BufferedReader bufferedReader = null;
            URI uri = null;

            try
            {
                requestAndMakeSheet(stringBuffer, bufferedReader, uri);
            }
            catch (Exception e)
            {
                //Toast.makeText(getBaseContext(), "Web Request Error", Toast.LENGTH_LONG).show();
                //Log.e("Web Request Error", e.getMessage());
                t1.interrupt();
                AlertDialog.Builder parsingErrorBox = new AlertDialog.Builder(ReservationInfo.this);
                parsingErrorBox.setTitle("Login error");
                parsingErrorBox.setMessage("You may have to check your credentials and then try again.");
                parsingErrorBox.show();
            }
            finally
            {
                if (bufferedReader!=null)
                {
                    try
                    {
                        bufferedReader.close();
                    }
                    catch (IOException ioe)
                    {
                        Log.e("Web Request Error", ioe.getMessage());
                    }
                }
            }
        }           
    });
    t1.start();
    try 
    {
        t1.join();
        mWebview.loadUrl("file:///"+Environment.getExternalStorageDirectory()+"/MySheet.html");
        setContentView(mWebview);
    } 
    catch (InterruptedException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //End of le thread
}

这段代码崩溃了,我认为它与 t1.interrupt 有关(尝试停止,但也没有用)。

如何修复此代码? 提前谢谢你。

【问题讨论】:

  • 发布您的 LogCat 错误,它通常可以准确地解释发生了什么。此外,您应该检查您的旧问题并接受最佳答案,人们自愿花时间帮助您,请用这个简单的手势“回报”他们。
  • 12-15 01:27:34.619: W/HardwareRenderer(14911): 尝试在主线程之外初始化硬件加速,中止 12-15 01:28:34.404: I/dalvikvm(14911 ): threadid=3: 对信号 3 做出反应 12-15 01:28:34.474: I/dalvikvm(14911): 将堆栈跟踪写入 '/data/anr/traces.txt' 这就是它所说的。但是我的应用程序中发生了很多错误。当 requestAndMakeSheet 抛出异常时,该文件应该不会显示在 webview 中,但实际上它确实加载了它(它加载了先前的文件 join())。此外,当它抛出异常时,活动会冻结!
  • 您始终可以使用调试器逐行检查您的代码,以缩小问题的根源。您还可以在 catch 块中使用 e.printStackTrace() 来查看错误详细信息。除此之外,requestAndMakeSheet() 是什么?
  • 我无法使用调试器,它本身就有问题!如果我尝试进入线程,它会显示“Class File Editor - Source not found for ClassLoader.class”!!!
  • 好的,我设法通过更改断点并将它们放入线程中来绕过调试器的错误。 requestAndMakeSheet 是一个巨大的函数,它使用 jSoup 来解析 HTML 文件。它的作用是当 jSoup 找不到页面的某些元素时抛出异常,当用户输入的登录名和/或密码不正确时会发生什么。我在我的代码中删除了 t1.interrupt() 但现在发生的情况是,当抛出异常时,警报对话框不显示,webView 显示“网页不可用”并且应用程序完全冻结。 :(

标签: android multithreading dialog alert


【解决方案1】:

为什么你还有 t1.interrupt() 呢?似乎您的线程无论如何都会被终止,那么将它放在那里的原因是什么?

【讨论】:

  • 因为我想如果我不这样做,消息框就永远不会出现。
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多