0

我的应用程序作为蓝牙服务器工作,几乎与BluetoothChat example. 我面临一个奇怪的问题。在我开始从蓝牙套接字读取输入的运行方法中,我想向处理程序发布一条消息。此处理程序位于单独的类中,以避免可能的内存泄漏。

public void run() {
    Log.i("", "BEGIN ReadInputThread");
    final byte[] buffer = new byte[1024];
    int bytesread;

    Message msg = handler.obtainMessage();
    msg.obj = "0";
    handler.sendMessage(msg);
    ...... snip .....

当我在我的处理程序中收到字符串“0”时,我想显示一个progressDialog,通知用户应用程序有一个传入文件。在我的处理程序中,这是我处理它的方式:

public class MessageHandler extends Handler {

    @Override
    public void handleMessage(Message m) {

        Vibrator v = (Vibrator) c.getSystemService(Context.VIBRATOR_SERVICE);
        String message = (String) m.obj;

        //Getting files
        if (message.equals("0")) {

            folder.appendToLogFile(new Date().toString(), "Incoming File From: " + deviceName); 
            v.vibrate(1500);
            pd = new ProgressDialog(c);
            pd.setTitle("Please Wait..");
            pd.setMessage("Retrieving file from " + deviceName);
            pd.setCancelable(false);
            pd.show();
        }
}

第一次,当我打开我的 Activity 时,它将启动这个线程,progressDialog 将显示。传输完成后,我导航到一个新的 Activity,然后返回到上一个 Activity。当我现在尝试传输文件时,它会成功,但屏幕上没有显示 ProgressDialog。

我做了一些检查,以确定 ProgressDialog 是否“可见”,方法是在pd.show() statement

if(pd.isShowing())
    Log.w("Handler: ", "inside the handler, and the progressdialog is showing");

这也出现在 LogCat 中,即使 ProgressDialog 没有显示!

任何人都可以给我一个提示,或解决这个令人沮丧的问题吗?

提前致谢!


只是为了澄清一点

我的 ProgressDialog 是在一个不扩展 Activity 的类中创建的,它不扩展任何类。我做的第一件事是在我的run() method. 当我知道我已从套接字接收到最后一个字节包时,我向处理程序发送另一条消息:

if(lastPacket) {
    msg = handler.obtainMessage();
    msg.obj = "1";  
    handler.sendMessage(msg);                                                    
}

在我的处理程序中:

@Override
    public void handleMessage(Message m) {

        Vibrator v = (Vibrator) c.getSystemService(Context.VIBRATOR_SERVICE);
        String message = (String) m.obj;

        //Getting files
        if (message.equals("0")) {

            folder.appendToLogFile(new Date().toString(), "Incoming File From: " + deviceName); 
            v.vibrate(1500);
            pd = new ProgressDialog(c);
            pd.setTitle("Please Wait..");
            pd.setMessage("Retrieving file from " + deviceName);
            pd.setCancelable(false);
            pd.show();
            if(pd.isShowing())
                Log.w("Handler: ", "inside the handler, and the progressdialog is showing");


        }

        //File complete 
        if(message.equals("1")) {

            Toast.makeText(c, "File Received from: " + deviceName, Toast.LENGTH_LONG).show();
            folder.appendToLogFile(new Date().toString(), "File Received"); 
            pd.setMessage(c.getResources().getString(R.string.createCase));

            GenerateCase caseGenerator = new GenerateCase(c, pd, lastCases, nextPCN);
            caseGenerator.execute("");
        }
    }

如您所见,我将 ProgressDialog 传递给 AsyncTask。在我的onPostExecute方法中,我忽略了这个ProgressDialog

解决方案

如果有人好奇。我对线程感到困惑。当我离开我的活动时,我忘记终止我正在运行的线程,这将导致当我恢复我的活动时 ProgressDialog 在不同的线程中启动。

4

1 回答 1

0

通过广播关闭您的进度对话框Intent

onPostExecute(){
sendBroadcastIntent(new Intent("ACTION_CLOSE_DIALOG"):
}

BroadCastReceiver receiver = new BroadCastReceiver(){
@Override
    public void onReceive(Context context, Intent intent) {
               if(pd.isShowing()){  
                pd.dismiss();
               }else{
                    pd.show()
                }
             }
        }

在这里调用广播:

pd.show();// call broadcast instead pd.show() use sendBroadcastIntent(new Intent("ACTION_CLOSE_DIALOG")
于 2012-11-22T12:11:09.860 回答