2014-06-16 58 views
1

我試圖從「Android的食譜」使用此代碼:我應該在Android環境中使用什麼?

AlertDialog.Builder builder = new AlertDialog.Builder(context); 
builder.setTitle("FetchAndPopTask.doInBackground exception"); 
builder.setMessage(e.getMessage()); 
builder.setPositiveButton("OK", null); 
builder.create().show(); 

...但不知道我應該替換爲「背景」。我已經嘗試過.java文件的類,直接類和「this」,但沒有編譯它們。

在更多的上下文,代碼:

public class SQLiteActivity extends ActionBarActivity { 

private FetchAndPopTask _fetchAndPopTask; 

. . . 

private class FetchAndPopTask extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     . . . 
     try { 
      . . . 
     } catch (Exception e) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); // <= "context"...? 
      builder.setTitle("If I go blind, I'll use a Service Platypus (instead of a Service Dog)"); 
      builder.setMessage(e.getMessage()); 
      builder.setPositiveButton("OK", null); 
      builder.create().show(); 
      return result; 
    } 

我嘗試了所有的以下內容:

AlertDialog.Builder builder = new AlertDialog.Builder(SQLiteActivity); 
AlertDialog.Builder builder = new AlertDialog.Builder(FetchAndPopTask); 
AlertDialog.Builder builder = new AlertDialog.Builder(this); 

...但沒有編譯;那麼「背景」需要在這裏?

回答

3

doInBackground()將在後臺線程上運行。您無法在非UI線程上觸摸您的用戶界面。這包括顯示對話框。從doInBackground()刪除AlertDialog。你可以把它放在例如在UI線程上運行的onPostExecute()。在那裏,您可以使用YourActivityName.this來將外部類this用作Context

3

AlertDialog.Builder(SQLiteActivity.this)或許應該工作

但是看看this question

編輯!!!!! 對不起,沒有注意到你正在嘗試顯示它在非UI線程中。請將它放在構造函數中或onPreExecute()/onPostExecute()方法

1

您必須將Activity傳遞給此構造函數。

你必須在FetchAndPopTask類補充一點:

private SQLiteActivity context; 

public FetchAndPopTask(SQLiteActivity context) { 
    this.context = context; 
} 

然後,在SQLiteActivity類,你必須使用this關鍵字(因爲你是一個活動,它指的是通過這種背景下):

/*...*/ 
FetchAndPopTask task = new FetchAndPopTask(this); 
task.execute(); 
/*...*/ 
+0

上下文中,您可以看到,異步任務類非靜態的,所以你可以使用「SQLiteActivity.this」更短 – Sam

+0

@ SamN,一個我不知道。的確更短,更方便。謝謝;) –

+0

不會說它更方便,因爲重構時可能會導致一些額外的工作(例如,當您將asynctask從此類中移出時)。然而它更短;) – Sam

1
new AlertDialog.Builder(this); 

this意味着你所以inste得到的FetchAndPopTask指針/參考使用this的廣告使用您的SQLiteActivity的指針/參考SQLiteActivity.this

1

定義構造函數類,並通過有

private class FetchAndPopTask extends AsyncTask<String, String, String> { 

private Context mContext; 

public FetchAndPopTask(Context context){ 
    mContext = context; 
} 

@Override 
protected String doInBackground(String... params) { 
    . . . 
    try { 
     . . . 
    } catch (Exception e) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(mContext); // <= use the variable here 
     builder.setTitle("If I go blind, I'll use a Service Platypus (instead of a Service Dog)"); 
     builder.setMessage(e.getMessage()); 
     builder.setPositiveButton("OK", null); 
     builder.create().show(); 
     return result; 
} 
相關問題