java - 无法在 doInbackground() 方法中执行 AlertDialog

标签 java android android-asynctask httpurlconnection

我在执行 postexecute() 上的 AlertDialog 时遇到问题。抛出这个异常 Caused by: java.lang.RuntimeException: 无法在未调用 Looper.prepare() 的线程内创建处理程序 或者,当我放入 AlertDialog.Builder 时,它只是不起作用 请帮助。 同样在输入错误密码的情况下,该过程终止。在用户名或密码无效的情况下如何调用 Toast 方法 下面是代码 fragment

public void Login() {

    // Toast.makeText(getBaseContext(), pass.getText() + " "
    // +user.getText(),
    // Toast.LENGTH_SHORT).show();

    String url = "http://107.20.195.151/mcast_ws/" + "?user="
            + user.getText().toString() + "&password="
            + pass.getText().toString();

    result = getHttpResponse(url);  
}


String result;
private String getHttpResponse(String location) {
    result = "";
    URL url = null;
    Log.d(LOGTAG, " " + "location " + location);
    try {
        url = new URL(location);
    } catch (MalformedURLException e) {
        Log.e(LOGTAG, " " + "error" + e.getMessage());
    }
    if (url != null) {
        try {
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String inputLine;
            int lineCount = 0;
            while ((inputLine = in.readLine()) != null) {
                result += inputLine.trim();
            }

            in.close();
            connection.disconnect();
        } catch (Exception e) {

            Log.e(LOGTAG, " " + "IOError " + e.getMessage());
            Toast.makeText(getBaseContext(), "No Internet Access",
                    Toast.LENGTH_SHORT);
        }
    } else {
        Log.e(LOGTAG, " " + "url" + url);
    }
    return result;
}

class PostToTwitter extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {

        Login();
        Log.d(LOGTAG, "Success");
        Log.d(LOGTAG, result);
        Log.d(LOGTAG, result.substring(0, 16).trim());
        // Log.d(TweetActivity.getLogtag(),"Successfully Posted: " +
        // params[0]);

        return "success";
    }

    @Override
    protected void onPostExecute(String r) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        String msg = "Login successful";

        if (result.substring(0, 16).trim().equals(msg)) {
            // System.out.println(result.substring(0, 16).trim());
            Log.d(LOGTAG, " " + "Connection Test" + result);
            AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
            builder.setMessage("Are you sure send this SMS?")
                   .setCancelable(false)
                   .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                            //...Attach another thread event to send the sms
                       }
                   })
                   .setNegativeButton("No", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                       }
                   });
            Log.e(LOGTAG, "Error detected 2");
            AlertDialog alert = builder.create();
            alert.show();
            //return  "success";
            // Toast.makeText(getBaseContext(),
            // "Login Succesful",Toast.LENGTH_SHORT).show();

        } else {
            Toast.makeText(getBaseContext(),
                    "Login UnSuccesful. Check Username or password",
                    Toast.LENGTH_SHORT).show();
            //return null;
        }
        // Toast.makeText(getApplicationContext(), result
        // ,Toast.LENGTH_SHORT).show();
        Log.e(LOGTAG, "Error detected");

        /*
        Intent i = new Intent("com.sms.subsahara.COMPOSESMS");
        startActivity(i);
        //Log.e(LOGTAG, " " + "error2");*/

    }

}

根据Alex的建议,我修改了上面的原始代码,但仍然报错。下面是logcat的异常

E/AndroidRuntime(  326): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  326): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime(  326):        at android.view.ViewRoot.setView(ViewRoot.java:472)
E/AndroidRuntime(  326):        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime(  326):        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime(  326):        at android.app.Dialog.show(Dialog.java:239)
E/AndroidRuntime(  326):        at com.sms.subsahara.WebMessengerActivity$PostToTwitter.onPostExecute(WebMessengerActivity.java:216)
E/AndroidRuntime(  326):        at com.sms.subsahara.WebMessengerActivity$PostToTwitter.onPostExecute(WebMessengerActivity.java:1)
E/AndroidRuntime(  326):        at android.os.AsyncTask.finish(AsyncTask.java:417)
E/AndroidRuntime(  326):        at android.os.AsyncTask.access$300(AsyncTask.java:127)
E/AndroidRuntime(  326):        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
E/AndroidRuntime(  326):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  326):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  326):        at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime(  326):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  326):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  326):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(  326):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(  326):        at dalvik.system.NativeStart.main(Native Method)

最佳答案

doInBackground 与 UI 线程不同步,这意味着您不能直接从该方法中操作 UI 元素、启动对话框等。修复很容易。只需将您的 AlertDialog 代码移动到 onPostExecute 方法( 与 UI 线程同步)。

在使用 AsyncTask 时,请记住:

  1. doInBackground 用于执行可能代价高昂的操作(网络访问、套接字连接、数据库查询等)
  2. onPostExecute 是为了对结果做一些事情,如果你愿意的话(这个方法与 UI 线程同步,所以你可以直接操作 UI 元素)

关于java - 无法在 doInbackground() 方法中执行 AlertDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11218839/

相关文章:

android - Android Fragment 回栈的问题

Android - 按下后退按钮时停止 AsyncTask 并返回到上一个 Activity

java - 向 Gradle 添加额外的测试套件

java - Class.forName 上的 ClassNotFoundException ("com.mysql.jdbc.Driver");

android - ListView android和空指针异常

android - AsyncTask,doInBackground 从不在 android 中运行

android - 支持库 AsyncTaskLoader 不支持被取消?

java - 2 台计算机的文件共享。

java - 数组编程 - 检查井字游戏中有 n 个玩家的 nxn 棋盘的赢家

android - 以编程方式从 Android 的 Url 获取证书信息