按下BACK按钮时,警告框不可见

时间:2012-06-22 19:28:46

标签: android alert back-button

在我的应用中,有一个按钮可以将图片上传到脸谱版。按下此按钮时,会出现一个警告框以获取用户标题,然后上传照片。现在如果我在将图片上传到Facebook时按下BACK按钮(在给出标题并按下OK之后),那么我再次看到我的活动,但这次当我再次尝试上传图片时,我看不到警告框(虽然它处于隐身模式,因为如果我点击OK按钮的位置,则会上传图片。这里发生了什么?

//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
    }
});

}

1 个答案:

答案 0 :(得分:1)

旋转设备以确定窗口是否不可见(它将保持不可见)或是否存在重绘问题(它将出现)。

重绘问题不是Android错误,而是你的app设计问题。你不应该在主(UI)线程上采取花费很多秒的操作,因为这样做会在操作期间阻止重绘。

您可以使用@ azgolfer评论中的提示(将上传重构为AsyncTask)。 创建AsyncTask的子类并在其fb方法中执行doInBackground。从execute处理程序创建其实例和OnClick。使用onPostExecute宣布完成上传并创建ProgressBar以显示任务进度。

实际上,OnClick处理程序的代码太多(就持续时间而言)。

或者,您可以随时致电invalidate以获得类似设备轮换的效果:

ViewGroup everything = findViewById (R.id.mainLayout);
everything.invalidate();

但这不是推荐的设计,如果您决定采取这种方式,您可能会发现自己在多个方面与框架作斗争。