ProgressDialog并不总是出现

时间:2012-11-22 11:45:34

标签: android

我的应用程序用作BluetoothServer,几乎与BluetoothChat example相同。我面临一个奇怪的问题。在我的run-method中,我开始从bluetoothSocket读取输入,我想向处理程序发布消息。此处理程序位于单独的类中,以避免可能的内存泄漏。

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时,将启动此Thread,progressDialog将显示。传输完成后,我导航到一个新的Activity,然后返回到上一个Activity。当我现在尝试传输文件时,它会成功,但屏幕上不会显示ProgressDialog。

我做了一些检查,只是通过在pd.show() statement下添加这两行来判断ProgressDialog是否“可见”

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

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

任何人都可以给我一个暗示或解决这个挫折问题的方法吗?

提前致谢!


只是澄清一下

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

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

解决方案

如果有人好奇的话。我对线程感到困惑。当我离开我的Activity时,我忘了杀死正在运行的线程,这会导致ProgressDialog在我恢复活动时在不同的线程中启动。

1 个答案:

答案 0 :(得分: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")