Java 首先执行服务器调用,然后执行下一行代码

Java 首先执行服务器调用,然后执行下一行代码,java,android,android-volley,Java,Android,Android Volley,我想先执行文本为“tex2”的Toast,然后执行文本为“text1”的Toast,但是 在我的代码中,当我执行下面的代码(我指的是具有相同结构的不同代码)时,它以相反的顺序打印。 (假设我要等待响应,然后执行下一步) A类 { 公共int onStartCommand(Intent Intent、int标志、int startId) { getdatafromnet(); Toast.makeText(getApplicationContext(),“text1”,Toast.LENGTH_L

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

A类
{
公共int onStartCommand(Intent Intent、int标志、int startId)
{
getdatafromnet();
Toast.makeText(getApplicationContext(),“text1”,Toast.LENGTH_LONG.show();
//……代码
}
void getdatafromnet()
{
//截击服务器呼叫
stringRequest=新的stringRequest(Request.Method.GET,url2,
新的Response.Listener()
{
@凌驾
公共void onResponse(字符串响应)
{
Toast.makeText(getApplicationContext(),“text2”,Toast.LENGTH_LONG.show();
}
});
//…跟随截击参数和呼叫
}
}

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

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

因为调用网络是异步的,所以无法得到正确的结果。 要处理它,可以使用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
                 });
}
A类
{
处理程序m_Handler=新处理程序(){
@凌驾
公共无效handleMessage(消息输入消息){
开关(inputMessage.what){
案例1:
getdatafromnet();
打破
案例2:
Toast.makeText(getApplicationContext(),“text1”,Toast.LENGTH_LONG.show();
//……代码
打破
违约:
super.handleMessage(inputMessage);
}
}
};
公共int onStartCommand(Intent Intent、int标志、int startId)
{
m_handler.sendEmptyMessage(1);
}
void getdatafromnet()
{
//截击服务器呼叫
stringRequest=新的stringRequest(Request.Method.GET,url2,
新的Response.Listener()
{
@凌驾
公共void onResponse(字符串响应)
{
Toast.makeText(getApplicationContext(),“text2”,Toast.LENGTH_LONG.show();
m_handler.sendEmptyMessage(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
                 });
}
A类
{
处理程序m_Handler=新处理程序(){
@凌驾
公共无效handleMessage(消息输入消息){
开关(inputMessage.what){
案例1:
getdatafromnet();
打破
案例2:
Toast.makeText(getApplicationContext(),“text1”,Toast.LENGTH_LONG.show();
//……代码
打破
违约:
super.handleMessage(inputMessage);
}
}
};
公共int onStartCommand(Intent Intent、int标志、int startId)
{
m_handler.sendEmptyMessage(1);
}
void getdatafromnet()
{
//截击服务器呼叫
stringRequest=新的stringRequest(Request.Method.GET,url2,
新的Response.Listener()
{
@凌驾
公共void onResponse(字符串响应)
{
Toast.makeText(getApplicationContext(),“text2”,Toast.LENGTH_LONG.show();
m_handler.sendEmptyMessage(2);
}//遵循截击参数和呼叫
});
}

除了您的方式,是否没有其他方式等待响应,然后执行下一行。到目前为止,我使用的是我向您解释的方式。即使在MediaPlayer库的官方文档中,对于在android中请求权限,对于请求外部URI,我发现只有这种方式。据我所知,没有其他方式可以等待直到android中的响应。例如,对于MediaPlayer,您使用prepareAsync和onPrepared listner。如果您想让它更复杂一些,您可以制作自己的广播侦听器,并在函数执行完毕后进行广播。然后,第二个函数应在应用程序接收广播时执行。希望这有帮助。没有其他way等待响应,然后执行下一行,而不是您的方式。到目前为止,我使用的是我向您解释的方式。即使在MediaPlayer库的官方文档中,对于请求android中的权限,对于请求外部URI,我发现只有这种方式。据我所知,没有其他方式可以等待androi中的响应d、 例如,对于MediaPlayer,您使用prepareAsync和onPrepared listner。如果您想让它稍微复杂一点,您可以制作自己的广播侦听器,并在函数执行完毕后进行广播。第二个函数应在应用程序接收广播时执行。希望这能有所帮助。您知道toeas toes不提供任何帮助对您的代码的响应?这只是向用户显示发生了什么事情。这里是另一个代码而不是Toast,我使用Toast作为示例来清除执行流,我想让您知道toeas toes不会对您的代码提供任何响应吗?这只是向用户显示发生了什么事情。Fire and Forget这里是一个示例其他代码,而不是Toast,我使用Toast作为示例来清除我想要的执行流