我的应用程序作为蓝牙服务器工作,几乎与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 在不同的线程中启动。