【问题标题】:How to call a toast message on success callback in class如何在课堂上的成功回调中调用 toast 消息
【发布时间】:2018-01-24 06:53:07
【问题描述】:

我正在使用 okhttp 库开发 POST API。一切工作正常,除了我无法找到一种方法来在它的成功回调上显示一个简单的 toast 消息。如何向用户调用 toast 消息,以便他知道数据是否已发布到服务器上,或者是否在成功和失败回调中?

P.S 下面的代码在不同的类中,而不是在活动类中。

这是我的代码:

public DataSource(Context context) {
    this.mContext = context;
    mDbHelper = new DBHelper(mContext);
    mDatabase = mDbHelper.getWritableDatabase();
}



    post(URL, jsonData, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i("FAILED", "onFailure: Failed to upload data to server");
                //here I want to show toast message
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {

                    Log.i("SUCCESSFUL", "onSuccess: data uploaded");

                    //here I want to show toast message

                } else {
                    Log.i("UN SUCCESSFUL", "onFailure: Failed to upload data to server");
                    //here I want to show toast message
                }
            }
       });

【问题讨论】:

  • 您是否在相同的活动/片段中得到响应?
  • 您是否在 Activity 或 Fragment 中收到此响应。
  • 将 Activity 或 Context 作为最终参数传递给 post(context, URL, jsonData, Callback) 方法并调用 Toast.makeText(context, "Message", Toast.LENGTH_SHORT).show();在回调中
  • 但是,如果在UI线程之外的另一个线程中调用onResponse(),则传递活动并调用runOnUIThread不会得到异常
  • Handler 或 Activity 如果您不检查应用程序的生命周期而不使用它们,则它们都容易泄漏。当一个 Activity 附加到一个类时旋转会导致它不会被清除,并导致你的应用程序泄漏内存,就像你的 Activity 和它的所有视图消耗一样多。并且每次旋转都会导致另一个泄漏,这可能使您的应用程序无法使用或导致 OutOfMemoryException。不仅要使用答案,还要学习如何用好它。

标签: java android


【解决方案1】:

每个应用程序都有自己的特殊线程来运行 UI 对象,例如 View 对象;这个线程称为 UI 线程。只有在 UI 线程上运行的对象才能访问该线程上的其他对象。因为您在线程池中的线程上运行的任务不在您的 UI 线程上运行,所以它们无权访问 UI 对象。要将数据从后台线程移动到 UI 线程,请使用在 UI 线程上运行的 Handler,或者可以使用 android 实现,如此处所示。

- 案例 1

 MyActivity.this.runOnUiThread(new Runnable() {
            @Override
            void run() {
               Toast.makeText(MyActivity.this,
                    "message", Toast.LENGTH_LONG).show();
            });

- 案例 2

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
       Toast.makeText(MyActivity.this,
                    "message", Toast.LENGTH_LONG).show();
    }
});

如果它是主线程,你会直接使用它

Toast.makeText(MyActivity.this,
                    "message", Toast.LENGTH_LONG).show();

【讨论】:

    【解决方案2】:

    这个回调是一个异步函数,你可以在UI线程中改变View,所以Handler会为你提供帮助。

        ....
        private final static int MSG_SUCCESS = 0x0001;
        private final static int MSG_FAIL = 0x0002;
        private Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                switch(msg.what){
                  case MSG_SUCCESS:
                     //Toast success
                      break;
                  case MSG_FAIL:
                     //Toast fail
                      break;
                  default:
                      break;
                }
            }
        };
    
        ......
        ......
    
        if (response.isSuccessful()) {
                  Log.i("SUCCESSFUL", "onSuccess: data uploaded");
                  handler.sendEmptyMessage(MSG_SUCCESS);
               } else {
                 Log.i("UN SUCCESSFUL", "onFailure: Failed to upload data to server");
                  handler.sendEmptyMessage(MSG_FAIL);
                }
         ......
    

    【讨论】:

      【解决方案3】:

      你遇到了错误

      java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare()

      因为您是从工作线程调用它。您需要从主线程中调用Toast.makeText()(以及处理 UI 的大多数其他函数)。您可以使用处理程序,

       @Override
       public void onResponse(Call call, Response response) throws IOException {
                      if (response.isSuccessful()) {    
                          Log.i("SUCCESSFUL", "onSuccess: data uploaded");
      
                          context.runOnUiThread(new Runnable() {
                          public void run() {
                          Toast.makeText(context, "SUCCESSFUL", Toast.LENGTH_SHORT).show();
                           }
                        });
                      }
      

      【讨论】:

        【解决方案4】:

        只需在调用此方法时发送您的活动上下文:

        void methodName(Context c){
        
         post(URL, jsonData, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            Log.i("FAILED", "onFailure: Failed to upload data to server");
                            //here I want to show toast message
                        }
        
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if (response.isSuccessful()) {
        
                                Log.i("SUCCESSFUL", "onSuccess: data uploaded");
                               Toast.makeText(c,"message",Toast.LENGTH_SHORT).show();
                                //here I want to show toast message
        
                            } else {
                                Log.i("UN SUCCESSFUL", "onFailure: Failed to upload data to server");
                                //here I want to show toast message
                            }
                        }
        });
        }
        

        【讨论】:

        • 我尝试过同样的事情,但它给了我以下错误:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
        【解决方案5】:

        试试这个

        TaskActivity.this.runOnUiThread(new Runnable() {
                @Override
                void run() {
                    Toast msg = Toast.makeText(TaskActivity.this,
                        "message", Toast.LENGTH_LONG);
                    msg.show();
                });
        

        【讨论】:

          【解决方案6】:

          试试这个

          Toast.makeText(YourActivity.this, "Your Message", Toast.LENGTH_SHORT).show();
          

          活动

          post(URL, jsonData, new Callback() {
                              @Override
                              public void onFailure(Call call, IOException e) {
                                  Log.i("FAILED", "onFailure: Failed to upload data to server");
                                  //here I want to show toast message
                                  Toast.makeText(YourActivity.this, "Your Message", Toast.LENGTH_SHORT).show();
                              }
          
                              @Override
                              public void onResponse(Call call, Response response) throws IOException {
                                  if (response.isSuccessful()) {
          
                                      Log.i("SUCCESSFUL", "onSuccess: data uploaded");
          
                                      //here I want to show toast message
                                      Toast.makeText(YourActivity.this, "Your Message", Toast.LENGTH_SHORT).show();
          
                                  } else {
                                      Log.i("UN SUCCESSFUL", "onFailure: Failed to upload data to server");
                                      //here I want to show toast message
                                      Toast.makeText(YourActivity.this, "Your Message", Toast.LENGTH_SHORT).show();
                                  }
                              }
             });
          

          片段

          post(URL, jsonData, new Callback() {
                              @Override
                              public void onFailure(Call call, IOException e) {
                                  Log.i("FAILED", "onFailure: Failed to upload data to server");
                                  //here I want to show toast message
                                  Toast.makeText(getActivity(), "Your Message", Toast.LENGTH_SHORT).show();
                              }
          
                              @Override
                              public void onResponse(Call call, Response response) throws IOException {
                                  if (response.isSuccessful()) {
          
                                      Log.i("SUCCESSFUL", "onSuccess: data uploaded");
          
                                      //here I want to show toast message
                                      Toast.makeText(getActivity(), "Your Message", Toast.LENGTH_SHORT).show();
          
                                  } else {
                                      Log.i("UN SUCCESSFUL", "onFailure: Failed to upload data to server");
                                      //here I want to show toast message
                                      Toast.makeText(getActivity(), "Your Message", Toast.LENGTH_SHORT).show();
                                  }
                              }
             });
          

          编辑

          Handler handler = new Handler();
          
          handler.runOnUiThread(new Runnable() {
            public void run() {
              Toast.makeText(mContext, "Your Message", Toast.LENGTH_SHORT).show();
            }
          });
          

          【讨论】:

          • 我不是在活动或片段中调用它。我试图在一个类中调用它,一个非 UI 线程
          • @3iL 然后你可以使用这个类的上下文。
          • 我正在使用上下文,但它给出了以下错误:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
          • @3iL 请在您的班级中添加更多 sn-p。
          • @3iL 欢迎,很高兴为您提供帮助。
          猜你喜欢
          • 2014-09-14
          • 1970-01-01
          • 2023-02-23
          • 1970-01-01
          • 2011-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多