Android 按下后退按钮时,警报框不可见
在我的应用程序中,有一个按钮可以将图片上传到facebook。当按下此按钮时,会出现一个带有用户标题的警报框,然后上传pic。现在,如果我在图片上传到facebook时按下后退按钮(在给出标题并按下Android 按下后退按钮时,警报框不可见,android,alert,back-button,Android,Alert,Back Button,在我的应用程序中,有一个按钮可以将图片上传到facebook。当按下此按钮时,会出现一个带有用户标题的警报框,然后上传pic。现在,如果我在图片上传到facebook时按下后退按钮(在给出标题并按下OK后),那么我会再次看到我的活动,但这次当我再次尝试上传图片时,我没有看到警告框(虽然它在不可见模式下存在,因为如果我点击OK按钮的位置,pic就会被上传。这里发生了什么 //Listener to button to upload to facebook class ButtonListener3
OK
后),那么我会再次看到我的活动,但这次当我再次尝试上传图片时,我没有看到警告框(虽然它在不可见模式下存在,因为如果我点击OK
按钮的位置,pic就会被上传。这里发生了什么
//Listener to button to upload to facebook
class ButtonListener3 implements View.OnClickListener{
@Override
public void onClick(View v) {
Pic.this.Commentbox();
}
}
public void Commentbox(){
value="";
alert1 = new AlertDialog.Builder(this);
alert1.setTitle("Write caption");
// Set an EditText view to get user input
final EditText input = new EditText(this);
alert1.setView(input);
alert1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
value = input.getText().toString();
Pic.this.fb();
}
});
alert1.setNegativeButton("No, thanks", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
value="";
Pic.this.fb();
}
});
alert1.show();
}
public void fb(){
final Facebook facebook=new Facebook(ID);
facebook.authorize(Pic.this, new String[] { "publish_stream" },
new DialogListener() {
@Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
}
@Override
public void onError(DialogError dialogError) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Bundle values) {
postToWall(values.getString(Facebook.TOKEN));
}
private void postToWall(String accessToken) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] data = baos.toByteArray();
Bundle bundle = new Bundle();
bundle.putString(Facebook.TOKEN, accessToken);
bundle.putByteArray("facebookPictureData", data);
// The byte array is the data of a picture.
bundle.putByteArray("picture", getIntent().getExtras().getByteArray("data"));
bundle.putString("caption",value);
try {
facebook.request("me/photos", bundle, "POST");
Toast.makeText(getApplicationContext(),"Picture uploaded to your facebook account successfully",
Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException fileNotFoundException) {
Toast.makeText(getApplicationContext(),"Picture upload failed, try again",
Toast.LENGTH_SHORT).show();
} catch (MalformedURLException malformedURLException) {
Toast.makeText(getApplicationContext(),"Picture upload failed, try again",
Toast.LENGTH_SHORT).show();
} catch (IOException ioException) {
Toast.makeText(getApplicationContext(),"Picture upload failed, try again",
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
});
}
旋转设备以确定窗口是否不可见(它将保持不可见)或是否存在重画问题(它将出现) 重画问题不是安卓错误,而是应用程序的设计问题。您不应该在主(UI)线程上执行耗时数秒的操作,因为这样做会在操作期间阻止重画 您可以使用@azgolfer评论中的提示(将上载重构为
AsyncTask
)。
创建AsyncTask
的子类,并在其doInBackground
方法中执行fb
。从OnClick
处理程序创建其实例并execute
。使用onPostExecute
宣布已完成的上载,并创建一个ProgressBar
以显示任务的进度
实际上,对于OnClick
处理程序来说,代码太多了(就持续时间而言)
或者,您可以随时调用invalidate
,以实现类似于设备旋转的效果:
ViewGroup everything = findViewById (R.id.mainLayout);
everything.invalidate();
但这不是一个推荐的设计,如果您决定这样做,您可能会发现自己在多个方面与框架抗争。您需要将对fb()的调用放入AsyncTask中。您当前的代码将阻止UI,直到发布到Facebook Wall完成。扩展AsyncTask并将调用放入fb()在doInBackground()方法内部。@azgolfer如果我使用async,并且假设用户在按下
upload
按钮后按下home按钮或back按钮,那么上传将发生还是将被中止。上传仍将在doInBackground()中发生方法。您可以在此过程中弹出一个进度对话框,以防止“后退”按钮取消操作。@azgolfer异步任务和启动新线程有什么区别吗?@azgolfer如果我使用异步,并且假设用户在按下上传
按钮后按home按钮或Back按钮,则上传将停止发生或将被中止。@JohnWatson-您的选择。默认情况下不是。异步任务和启动新线程有什么区别吗?这是一个重新绘制的问题,旋转手机会发出警报,您能解释一下如何解决这个问题吗?@JohnWatson-扩展了推荐的方法,编辑掉了t他回答了这个问题,并添加了一个类似的笨拙解决方案,在一个设计糟糕的应用程序中调用重画。