2015-09-09 63 views
-1

當我的AsyncTask完成時,我在TextView中顯示信息。如何從AsyncTask onPostExecute顯示Toast?

@Override protected void onPostExecute(Void x) 
    { 
     MainActivity.lblLastLetterProcessed.setText("A-Z loaded"); 
    } 

像這樣:

public static void setLastLetterProcessed(char c){ 
    lblLastLetterProcessed.setText("" + c); 
    } 

我寧願通過Toast給信息,但Toast需要Context

protected void onPostUpdate(Integer... progress) 
{ 
    Toast toast= Toast.makeText(???????????, "Loaded A-Z", Toast.LENGTH_LONG); 
    toast.show(); 
} 

所以我寫了popupMessage

void popupMessage(String text) 
    { 
    SpannableStringBuilder altText = new SpannableStringBuilder(text); 
    altText.setSpan(new ForegroundColorSpan(0xFFCC5500), 0, altText.length(), 0); 
    int duration = Toast.LENGTH_SHORT; 
    Context context = getApplicationContext(); 
    Toast toast = Toast.makeText(context, altText, duration); 
    toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0); 
    toast.show(); 
    } 

但由於popupMessage不是static我不能從onPostUpdate調用它。

如果我使它static,我不能使用getApplicationContext。如果我添加Context作爲參數,我不能從onPostUpdate通過Context

谷歌搜索沒有提供任何我可以實現的答案。

我該怎麼辦?

+1

http://stackoverflow.com/questions/28659165/toast-in-asynctask-in-non-activity-cla ss – codeMagic

+0

^那,並檢查我的答案 –

回答

3
public class MyTask extends AsyncTask<Void, Void, Void>{ 
    private Context mContext; 

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

    ... 
    ... 

    protected void onPostUpdate(Integer... progress){ 
     Toast toast= Toast.makeText(mContext, "Loaded A-Z", Toast.LENGTH_LONG); 
     toast.show(); 
    } 
} 

並創建實例,像這樣:

MyTask task = new MyTask(MyActivity.this).execute(); 

這是我做的AsyncTask的要求論點,我還定義回調這樣在任務的構造函數與調用它們的活動互動。

+1

我建議傳遞活動上下文與'Toast'一起使用。 [閱讀此SO回答](http://stackoverflow.com/a/7298955/1380752)和[上下文,什麼上下文](https://possiblemobile.com/2013/06/context/) – codeMagic

+0

正確,無論哪種方式將工作 –

+0

@ LucasCrawford - 謝謝。我沒有馬上得到它,但它工作。我將發佈工作代碼。 – DSlomer64

0

感謝@Lucas克勞福德,這個工程:

public class ListMaker extends ArrayList<String> 
{ 
    Context mContext; ////////////////////////////// 
    ...  

    public ListMaker(AssetManager assets, Context c){ 
    //         ^^^^^^^^^^ 
    ...  
    mContext = c; ///////////////////////////////// 

    LoadWords loadWords = new LoadWords(); 
    ... 
    loadWords.execute((Object []) null); 
    } 

    private class LoadWords extends AsyncTask<Object, Integer, Void> 
    { 
    @Override protected Void doInBackground(Object... params) 
    { 
     ... 
     publishProgress(...); 
    } 

    @Override protected void onPostExecute(Void x) 
    { 
     Toast toast= Toast.makeText(mContext, "Loaded A-Z", Toast.LENGTH_LONG); 
     //       ^^^^^^^^ 
     toast.show(); 

    } 
    ... 
    } 
} 

更妙的是我有一個改進的,更加有用popupMessage,我可以從onPostExecute調用像這樣:

 MainActivity.popupMessage("Loaded A-Z", mContext); 

這裏,它是:

public static void popupMessage(String text, Context context) 
    //  ******        ********** 
    { 
    SpannableStringBuilder altText = new SpannableStringBuilder(text); 
    altText.setSpan(new ForegroundColorSpan(0xFFCC5500), 0, altText.length(), 0); 
    int duration = Toast.LENGTH_SHORT; 
    Toast toast = Toast.makeText(context, altText, duration); 
    toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0); 
    toast.show(); 
    } 
+0

當我看到事情是多麼容易,我爲什麼沒有想到這一點,但我想這就是我們學習的方式,這有點讓我感到煩惱...... – DSlomer64

+0

*我*學習... – DSlomer64