0

我正在实现一个 android 应用程序。我的问题是,当我将数据从客户端发送到服务器时,我希望客户端知道数据已成功发送。我已经实现了一个 AlertDialog,但是当我发送数据时,我收到一条消息“无法在未调用 Looper.prepare() 的线程内创建处理程序”。我在下面附上了我的代码。

    private void saveOrder(final Order order) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
            try {
                getConnection().saveOrder(order);
                handleSuccessSaveOrder();
            }
            catch (Exception exc) {
                Log.d("--- ERROR ---", exc.getMessage());
                handleException(exc.getMessage());
            }
        }
    });
    thread.start();
}

private void handleSuccessSaveOrder() {
    showAlert(Farsi.Convert(" j "),R.drawable.warning);
    //showActivity(MainMenuActivity.class);
}

private void showAlert(String message, int iconId) {
    alert = new AlertDialog.Builder(ReviewOrderActivity.this);
    alert.setTitle("Status Dialog");
    alert.setMessage(message);
    alert.setIcon(iconId);

      alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface arg0, int arg1) {
      showActivity(MainMenuActivity.class); } });


    alert.show();

}
4

4 回答 4

4

您不能从非 ui 线程修改 ui,请使用runOnUiThread

private void saveOrder(final Order order) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
        try {
            getConnection().saveOrder(order);
            runOnUiThread(new Runnable() {
                 public void run() {
                   handleSuccessSaveOrder();
                 }
            });

        }
        catch (Exception exc) {
            Log.d("--- ERROR ---", exc.getMessage());
            handleException(exc.getMessage());
        }
    }
});
thread.start();
}
于 2012-12-12T07:37:50.947 回答
3

你不能UI从背景线程改变。像这样使用

private void handleSuccessSaveOrder() {
ReviewOrderActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                showAlert(Farsi.Convert(" j "),R.drawable.warning);

            }
        });

    //showActivity(MainMenuActivity.class);
}
于 2012-12-12T07:37:07.663 回答
2

制作处理程序以显示 AlertDialog 并尝试下面的代码而不是上面的代码,它将解决您的问题。

private void saveOrder(final Order order) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                getConnection().saveOrder(order);
                mHandler.sendEmptyMessage(0);
            }
            catch (Exception exc) {
                Log.d("--- ERROR ---", exc.getMessage());
                handleException(exc.getMessage());
            }
        }
    });
    thread.start();
}

public Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        handleSuccessSaveOrder();
    }
};

private void handleSuccessSaveOrder() {
    showAlert(Farsi.Convert(" j "),R.drawable.warning);
}

private void showAlert(String message, int iconId) {
    alert = new AlertDialog.Builder(ReviewOrderActivity.this);
    alert.setTitle("Status Dialog");
    alert.setMessage(message);
    alert.setIcon(iconId);

    alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg0, int arg1) {
            showActivity(MainMenuActivity.class); 
        } 
    });

    alert.show();

}
于 2012-12-12T07:41:40.400 回答
1

“无法在未调用 Looper.prepare() 的线程内创建处理程序”是由于:

在后台线程中运行进程时无法显示Alert dialogin UI 线程。

因此,将警报对话框放置在您的 UI 线程中handleSuccessSaveOrder(),如下所示:

this.runOnUiThread(new Runnable() {
                    public void run() {
                        showAlert(Farsi.Convert(" j "),R.drawable.warning);
                    }
                });
于 2012-12-12T07:41:24.537 回答