我的应用程序用作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在我恢复活动时在不同的线程中启动。
答案 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")