使用 Retrofit 发送 POST 请求并接收 Json 响应无法使用响应数据我需要将其传递给另一个活动

Posted

技术标签:

【中文标题】使用 Retrofit 发送 POST 请求并接收 Json 响应无法使用响应数据我需要将其传递给另一个活动【英文标题】:Sending POST Request and Receive Json Responds using Retrofit Unable to use Responds data I need to pass it to another activity 【发布时间】:2016-09-21 06:05:20 【问题描述】:

我正在使用 Retrofit 发送 POST 请求。服务器返回的是 JSON 响应,我能够在回调方法中解析响应。我需要将数据从服务器传递到另一个活动。但是我不能在外面使用响应数据。

    api.LoginUser(
            Email.getText().toString(),          // passing value to interface of retrofit
            Password.getText().toString(),
            new Callback<Response>() 
                @Override
                public void success(Response result, Response response) 
                    BufferedReader reader = null;
                    String output = "";
                    try                    
                        reader = new BufferedReader(new InputStreamReader(result.getBody().in()));
                        output = reader.readLine();
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    //Json PArsing
                    try 
                        JSONObject mainObject = new JSONObject(output);
                        JSONObject dataObj = mainObject.getJSONObject("data");
                        String id = dataObj.getString("id");
                        String name = dataObj.getString("name");
              n=name;
                        Log.d("jsontext", n);                               //This works
                    
                    catch(JSONException e)
                    
                         e.printStackTrace();
                    

                    Toast.makeText(MainActivity.this, output, Toast.LENGTH_LONG).show();
                
                @Override
                public void failure(RetrofitError error) 
                    //If any error occured displaying the error as toast
                    Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
                
            
    );

当它执行应用程序崩溃时我不能使用它。它可以现在变量中没有值。如何从回调响应 OnSuccess 方法中获取值???

            Log.d("outer",n);
            Intent dash = new Intent(this,Dashboard.class);
            dash.putExtra("Value",fi);
            startActivity(dash);


【问题讨论】:

带有 jsontext 的日志在涉及带有外部的日志时给出了名称 - 它给了我一个错误 -printf 需要一个值来打印 - 我认为Log.d("outer",n); 错误就在这里。检查n 是否不是null n 在回调函数内部保存名称的值,它的作用域在函数外部退出 发布logcat比 请发布您的日志。 【参考方案1】:

你可以创建一个对象并实现Serializable

class User implements Serializable 
...

然后将对象User放到bundle中,添加到intent中:

Bundle bundle = new Bundle();
bundle.putSerializable("data", user);
Intent intent = new Intent(this, YourClass.class);
intent.putExtras(bundle);
startActivity(intent);

希望对你有所帮助。

【讨论】:

感谢您的回复,该值仅在回调函数中可用,我无法将其存储到全局变量中它不起作用 Intent 无法在回调函数中实现。 我知道您想将对象发送到另一个活动?【参考方案2】:

将所有数据保存在一个字符串中,并使用意图应用程序另一个活动并对其进行解析;

【讨论】:

感谢您的回答,但 Intent 无法在 CALLBACK 函数中实现【参考方案3】:

你可以这样做

public void onSuccess(int statusCode, Header[] headers, 字节[] 响应)

            try 

                BufferedReader br = new BufferedReader(
                        new InputStreamReader(new ByteArrayInputStream(
                                response)));
                String st = "";
                String st1 = "";
                while ((st = br.readLine()) != null) 

                    st1 = st1 + st;

                
               showStoreData(st1);

             catch (Exception e) 
                e.printStackTrace();
            
        

        @Override
        public void onFailure(int statusCode, Header[] headers,
                              byte[] errorResponse, Throwable e) 
            // called when response HTTP status is "4XX" (eg. 401, 403, 404)
            Log.e("FAIL", "FAIl" + statusCode);
                       

        @Override
        public void onRetry(int retryNo) 
            // called when request is retried
        
    );

之后

public void showStoreData(String st)

   Intent intent = new Intent(this, YourClass.class);
    intent.putExtras(st);
     startActivity(intent);

【讨论】:

【参考方案4】:

您应该使用从调用方法初始化的接口并作为参数传递给您的请求类,这样您就可以从任何地方调用请求并将回调响应返回到您调用它的位置,例如是:

一个通用接口,在另一个文件中分隔:

public interface SomeCustomListener<T>

    public void getResult(T object);

在你打电话的班级里(完成你需要的东西):

public void someRequestReturningString(Object param1, final SomeCustomListener<String> listener)

//here you initialize what you need... it's your stuff

    response.enqueue(new Callback<ResponseBody>()
    
        @Override
        public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> rawResponse)
        
            try
            
              String response = rawResponse.body().string();

              // do what you want with it and based on that...
              //return it to who called this method
              listener.getResult("someResultString");
            
            catch (Exception e)
            
             e.printStackTrace();
             listener.getResult("Error1...");
            
          
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable throwable)
        
            try
            
             // do something else in case of an error
             listener.getResult("Error2...");
            
            catch (Exception e)
            
             throwable.printStackTrace();
             listener.getResult("Error3...");
            
        
    );

然后从您调用请求的位置(可以是任何地方、片段、onClicks 等):

public class BlaBla

//.....

    public void someMethod()
    
    NetworkManager.getInstance().someRequestReturningString(someObject, new SomeCustomListener<String>()
        
            @Override
            public void getResult(String result)
            
                if (!result.isEmpty())
                
                 //do what you need with the result...
                
            
        );
    

如果需要更多上下文,可以参考this SO thread。

希望这会有所帮助!

【讨论】:

以上是关于使用 Retrofit 发送 POST 请求并接收 Json 响应无法使用响应数据我需要将其传递给另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

使用 Retrofit 发送带有参数的 Post 请求

使用Retrofit发送POST请求提交JSON数据

Java发送POST请求,参数为JSON格式,并接收返回JSON数据

如何使用 Retrofit 将参数传递给 POST 请求,然后序列化请求?

http, post请求,发送json,并接收数据

java代码发送post请求,并接收xml文件。。。 发送请求时要带参数