【问题标题】:execute server call first then next line of code先执行服务器调用,然后执行下一行代码
【发布时间】:2023-03-08 11:56:01
【问题描述】:

我想先执行带有文本“tex2”的 Toast,然后执行带有文本“text1”的 Toast,但是 在我的代码中,当我执行下面的代码(我的意思是具有相同结构的不同代码)时,它会以相反的顺序打印。
(说我想等待响应然后执行下一步)

class A
{
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
       getdatafromnet();
       Toast.makeText(getApplicationContext(), "text1", Toast.LENGTH_LONG).show();
       //..................code
    }

    void getdatafromnet()
    {
       //volley server call
       stringRequest=new StringRequest(Request.Method.GET, url2,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        Toast.makeText(getApplicationContext(), "text2",Toast.LENGTH_LONG).show();
                    }
                 });

       //....follwing volley parameters and calls
     }
}

【问题讨论】:

  • 您知道 toeas toes 不会对您的代码提供任何响应吗?它只是向用户显示发生了一些事情。开火并忘记
  • 还有另一个代码而不是Toast,我以Toast为例来清除我想要的执行流程

标签: java android android-volley


【解决方案1】:

如果您希望在服务器调用返回后执行某些操作。最好将代码放在 onResponse 方法中或从 onResponse 方法中调用函数。

【讨论】:

  • 没有其他方法可以等待响应然后执行下一行而不是您的方式。
  • 到目前为止,我都使用了我向您解释的方式。即使在 MediaPlayer Library 的官方文档中,对于在 android 中请求权限,对于请求外部 URI,我也发现只有这种方法。
  • 据我所知,没有其他方法可以等到android中的响应。例如对于 MediaPlayer,您使用 prepareAsync 和 onPrepared 侦听器。
  • 如果你想让它更复杂一点,你可以制作自己的广播监听器,并在函数执行完成时进行广播。当你的应用接收到广播时,第二个函数应该会执行。
  • 希望对您有所帮助。
【解决方案2】:

由于调用网络是异步的,你无法得到正确的结果。 要处理它,您可以使用 android.os.Handler。

例如;

class A
{
 Handler m_handler = new Handler() {
    @Override
    public void handleMessage(Message inputMessage) {
       switch (inputMessage.what) {
            case 1:
                getdatafromnet();
                break;
            case 2:             
                Toast.makeText(getApplicationContext(), "text1", Toast.LENGTH_LONG).show();
                //..................code
                break;
            default:
                super.handleMessage(inputMessage);
        }
    }
 };

 public int onStartCommand(Intent intent, int flags, int startId) 
  {
    m_handler.sendEmptyMessage(1);
  }

  void getdatafromnet()
  {
  //volley server call
    stringRequest=new StringRequest(Request.Method.GET, url2,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                      Toast.makeText(getApplicationContext(), "text2",Toast.LENGTH_LONG).show();
                      m_handler.sendEmptyMessage(2);    
                    }//..........follwing volley parameters and calls
                 });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2018-12-01
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多