将 Activity 上下文传递给 Toast 的处理程序(片段)

Passing Activity Context to Handler(fragment) for Toast

我正在尝试在处理程序片段中使用 Toast 消息 class 但我无法访问主 class' 上下文。处理程序与主要 activity、PlayFrets(也是 UI 线程)在同一个 class 中。我在 Whosebug 上阅读了关于这个主题的大量问题,但是几乎每个解决方案都涉及将 getActivity() 或 getActivity().getApplicationContext() 传递到 Toast 的上下文字段中。当我尝试这个时,我得到错误

相关代码如下:

public class PlayFrets extends Activity {
. 
.
.
    static Handler mHandler = new Handler(Looper.getMainLooper()){  
        public void handleMessage(final Message msg){ 
            if(msg.obj != null){                
                runOnUiThread(new Runnable() {
                   public void run() {
                   //error happens here on Toast message
                       Toast.makeText(getActivity(), "Background Thread sent "+  msg.what + " bytes: " + msg.obj,Toast.LENGTH_SHORT).show();
                    }
                });
            }
            else{
            }
        }
    };
}

这些是我尝试传递上下文和每个变体产生的错误。

Toast.makeText(PlayFrets.this.getActivity()...)

^^^方法 getActivity() 未定义类型 PlayFrets

Toast.makeText(PlayFrets.this...) 

^^^在范围内无法访问类型 PlayFrets 的封闭实例

 Toast.makeText(getActivity().getApplicationContext()...)

^^^方法 getActivity() 未定义类型 new Runnable(){}

将主要 activity 的上下文传递到处理程序片段以用于 Toast 消息的正确方法是什么?

Activity 本身就是一个上下文。而不是你尝试的所有事情你应该

  • 未创建 static 处理程序 - 这就是您尝试通过 PlayFrets.this 失败的原因
  • 传递 PlayFrets.this 作为上下文
  • 无需调用 runOnUiThread(),因为处理程序在当前案例中处理 UI 线程上的消息

您的处理程序代码应如下所示:

Handler mHandler = new Handler() {  
    public void handleMessage(final Message msg){ 
        if(msg.obj != null){
                   Toast.makeText(PlayFrets.this, "Background Thread sent "+  msg.what + " bytes: " + msg.obj,Toast.LENGTH_SHORT).show();
        }
        else{
        }
    }
};