2013-03-07 19 views
0

我混淆了'上下文'和'這個',我不知道爲什麼下面的例子不起作用。上下文和這個android

我試圖從我LoginActivity調用下面的子類:

new SyncData(LoginActivity.this).execute(); // This will failed 

public class SyncData extends AsyncTask <Void, Void, String> { 
    private Context context; 
    public SyncData(Context context){ 
     this.context = context; 
    } 
    ProgressDialog progress=ProgressDialog.show(context, "", "Please wait...", true); //NOT WORK!!! 
} 

但要是讓說我改變這一行它的工作原理:

ProgressDialog progress=ProgressDialog.show(LoginActivity.this, "", "Please wait...", true); // This will work 

可有人請向我解釋怎麼可能我解決這個如果我想把這個子類放在一個新的類文件中?

+0

你是什麼意思'不工作'?你有沒有顯示任何異常或對話? – sandrstar 2013-03-07 09:34:25

+1

我已經在測試應用上測試了兩種變體,兩者的工作原理都是一樣的。你能分享更多的代碼/細節嗎? – sandrstar 2013-03-07 09:40:57

回答

0

在您的AsyncTask類中,您聲明progress進度是一個全局變量,因爲您已將它放在方法塊之外。因此,該行:

ProgressDialog progress=ProgressDialog.show(context, "", "Please wait...", true); 

SyncData對象首先由被執行,構造函數被調用之前。由於您的構造函數還沒有被調用,contextnull,當您嘗試使用它時會導致錯誤。

使用LoginActivity.this而不是context可行,因爲SyncDataLoginActivity的內部類,因此您可以從內部類的內部訪問其範圍。

如果要使用context,請嘗試將progress聲明的賦值部分移到構造函數之後的方法中,如onPreExecute()。例如:

public class SyncData extends AsyncTask <Void, Void, String> { 
    private Context context; 
    ProgressDialog progress; 
    public SyncData(Context context){ 
     this.context = context; 
    } 

    protected void onPreExecute() { 
     progress=ProgressDialog.show(context, "", "Please wait...", true); 
    } 

} 
0

這是因爲SyncData類的context參數在您嘗試顯示ProgressDialog時未初始化。對象參數在調用構造函數SyncData之前被初始化。