类的方法在类的方法初始化后为null

时间:2014-06-05 22:14:04

标签: java android progressdialog

我知道这不是一个严肃的问题(我的代码并不完美......)但是我想知道为什么在字段初始化之后,作为参数传递给方法,字段有一个空指针(空)?

public class MainActivity extends ActionBarActivity{
private ProgressDialog prdialog;

    ProgressDialog prepareDialog(ProgressDialog pr){
        if (pr==null){
            pr=new ProgressDialog(this);
        }
        pr.setTitle(R.string.Download);
        pr.setCanceledOnTouchOutside(false);
        pr.setCancelable(false);
        pr.setMessage(getString(R.string.Wait_));
        return pr;
    }
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        prepareDialog(prdialog).show();
        //do some operations
        prdialog.dismiss();//here my app is crashes because prdialog=null
    }
}

2 个答案:

答案 0 :(得分:2)

Java仅对参数使用pass-by-value。见Is Java "pass-by-reference" or "pass-by-value"?

这意味着该行

    prepareDialog(prdialog).show();

更新prdialog的值(虽然它确实产生了结果,但您也没有将其分配给prdialog成员)。因此,它以后是空的。你想做的可能是:

ProgressDialog prepareDialog() {
    ProgressDialog pr = new ProgressDialog(this);
    pr.setTitle(R.string.Download);
    pr.setCanceledOnTouchOutside(false);
    pr.setCancelable(false);
    pr.setMessage(getString(R.string.Wait_));
    return pr;
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    prdialog = prepareDialog();
    prdialog.show();
    //do some operations
    prdialog.dismiss();
}

另一种解决方案(如果你想多次调用prepareDialog(),但重用对话而不是创建一个新对话框),那就是:

void prepareDialog() {
    if (prDialog == null)
        prDialog = new ProgressDialog(this);

    prDialog.setTitle(R.string.Download);
    prDialog.setCanceledOnTouchOutside(false);
    prDialog.setCancelable(false);
    prDialog.setMessage(getString(R.string.Wait_));
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    prepareDialog();

    prdialog.show();
    //do some operations
    prdialog.dismiss();
}

答案 1 :(得分:0)

您的调用**prepareDialog(prdialog).show();**会传递您的**prdialog**对象的引用,但该方法会返回您忽略的完全构造的对象。由于java只传递值(引用的值在这里传递),你需要保留返回对象的引用。

你必须做prdialog = prepareDialog(prdialog);之类的事情。之后,您的prdialog对象将完全构建供您使用。