当前位置: 首页 > 知识库问答 >
问题:

JAVA在另一个类中检索截击结果变量值时遇到麻烦

利俊迈
2023-03-14

你好,在我的android Java项目中,我有两个类:一个是API witch,它位于本地的android模块库中,该库包含以下代码

package com.example.validationchecklib;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.widget.Toast;
import android.app.Application;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class API extends Application{

    public static int result;
    public static int resultInApi;

    public int checkSubscription(String packageName, String purchaseCode, RequestQueue q) {

        String apiUrl = "https://package.evisions.tech/check_validation.php?package_name=" + packageName;

        // creating a new variable for our request queue
        //RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        // in this case the data we are getting is in the form
        // of array so we are making a json array request.
        // below is the line where we are making an json array
        // request and then extracting data from each json object.
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, apiUrl, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {


                for (int i = 0; i < response.length(); i++) {
                    //creating  a new Json object and getting each
                    //object from our json array.
                    try {
                        // we are getting each json object.
                        JSONObject responseObj = response.getJSONObject(i);
                        // now we get our response from API in json object format.
                        // in below line we are extracting a string with
                        // its key value from our json object.
                        // similarly we are extracting all the strings from our json object.
                        String apiPackage = responseObj.getString("package_name");
                        String apiPurchaseCode = responseObj.getString("purchase_code");
                        int apiStatus = responseObj.getInt("status");


                        if (apiStatus == 1) {
                            if (apiPackage.equalsIgnoreCase(packageName) && apiPurchaseCode.equalsIgnoreCase(purchaseCode)) {
                                //subcription status is valid and user inputed data matches with api data
                                result = 1;
                                System.out.println("Result in Api = "+result);
                                break;
                            }
                        } else if (apiStatus == 0) {
                            result = 0;
                            System.out.println("Result in Api = "+result);
                            break;
                        } else {
                            result = 2;
                            System.out.println("Result in Api = "+result);
                            break;
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                result = 3;
                System.out.println("Result in Api = Failed to get the data...");
            }
        });

       q.add(jsonArrayRequest);
        return result;
    }




}

第二个类是主活动,我想从API类上的check Subsccription()方法中检索值,但即使来自volley的请求值为1,我也会得到0。

您可以使用以下url测试请求:https://package.evisions.tech/check_validation.php?package_name=aaaa

这是MainActivity的代码

package com.example.aaaa;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import com.example.validationchecklib.Subscription;
import com.example.validationchecklib.API;


import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    //Sample implementation of the Purchase validation android Library
    public String packageName, purchaseCode;
    public TextView txtPackageName, txtPurchaseCode;
    public Button btnResult;
    int serverResponse;
    public String r;
    private ArrayList<Subscription> subscriptionModalArrayList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        subscriptionModalArrayList = new ArrayList<>();

        txtPackageName = findViewById(R.id.edtPackageName);
        txtPurchaseCode = findViewById(R.id.edtPurchaseCode);
        btnResult = findViewById(R.id.btnVerify);
        RequestQueue queue = Volley.newRequestQueue(this);

        API api = new API();


         btnResult.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {


                 packageName = txtPackageName.getText().toString().trim();
                 purchaseCode = txtPurchaseCode.getText().toString().trim();
                 serverResponse = api.checkSubscription(packageName,purchaseCode, queue);

                 System.out.println("Result = "+serverResponse);

                 if(api.result == 1){
                     subscriptionModalArrayList.add(new Subscription(packageName,purchaseCode));
                     Intent intent = new Intent(MainActivity.this, ValidationResult.class);
                     startActivity(intent);
                 }
                 if(api.result == 0){
                    Toast.makeText(MainActivity.this, "Inactive Subscription", Toast.LENGTH_LONG).show();
                    System.exit(1);
                 }
                 if(serverResponse == 2 || serverResponse == 3){
                     Toast.makeText(MainActivity.this, "Failed to fetch data from API or other Error...", Toast.LENGTH_LONG).show();
                     System.exit(1);
                 }

                 txtPackageName.setText("");
                 txtPurchaseCode.setText("");
             }
         });

    }

}

共有1个答案

贺子昂
2023-03-14

您发出的请求是异步的,您必须等待它的响应。

您看到的行为(总是返回零),因为结果变量尚未初始化,默认值为零。

public static int result;

您可以将回调传递给checkSubscription方法,当您收到请求的结果(失败或成功)时,将调用该方法。

可以通过如下方式定义一个接口来实现:

public interface Callback {
    public void onSuccess(int result);
    public void onFailure(String error);
}

并让你的活动实现这个方法:

public class MainActivity extends AppCompatActivity implements Callback {

 ...

 public void onSuccess(int result) {
    //Your logic here
 }

 public void onFailure(String error) {
    //Your logic here
 }
}

并确保将活动传递给API:

public int checkSubscription(String packageName, String purchaseCode, RequestQueue q, Callback callback) {
   .....
   callback.onSuccess(result)


  public void onErrorResponse(VolleyError error) {
            result = 3;
            System.out.println("Result in Api = Failed to get the data...");
           callback.onError("YOUR_ERROR_MESSAGE");
        }
}

免责声明:以上代码只是一个粗略的大纲,应该进行测试

 类似资料:
  • 我正在尝试从CSV文件导入数据。我对导入过程没有任何问题。但是,当我将一个导入的数组从CSV文件传递到另一个类中的另一个方法时,我无法从数组中获取和打印值。我得到了以下打印:[1,2.0,[[Ljava.lang.字符串;@1e81f4dc]。“1”和“2”是导入值,没有问题。 我真正的麻烦是获取并打印“[Ljava.lang.String;@1e81f4dc]”中的值。 如果您能帮助了解如何获取

  • 我的主课有两个班(我们称它们为classA和classB)。 是否有机会在classB中设置classA变量? 诸如此类: 非常感谢!问候

  • 当我在类中声明/初始化变量时(setter和getter)。如何从另一个类更改此值

  • 我写了一个初始化脚本,设置用户环境变量,这些变量是经过哈希和加密的密钥...创建密钥后,不再需要密钥加密exe。我想启动主应用程序并删除包含哈希和密钥加密功能的init文件。 我没有任何问题与任何上述...当彼此独立时,一切都应该正常工作。问题是,为了让主应用程序能够访问新创建的环境变量,我需要init脚本完全退出... 我尝试过的每一件事,带旗帜的Popen,os。system()和其他人仍然让

  • 我目前正在与tkinter一起完成一项学校作业,为用户创建一个图形用户界面以输入他们的输入。我决定将输入分成不同的页面,以避免用户被问题淹没,并且不需要滚动 每一页都有一系列标签和条目,在一个右除数和一个左除数上分开,我已经设法在每一页上实现了这一点,付出了一些努力。这是我工作代码的简化版本: 然而,在将每个页面拆分为两个不同的Frame()容器时,我遇到了两个问题: 用ipadx和ipady设置

  • 我在class中定义了一个变量。它可以很好地执行Account类中定义的提款功能。但是,我希望访问Sav\u acct类中存在的函数interest中的变量值。它将收回的值取为0。如何使用兴趣函数中的函数中的函数的值,以便执行正确的数学运算? 导入java。util。扫描仪; 类别帐户{ 双重撤回; } 作废取款(){ 扫描仪sc=新扫描仪(系统英寸); 系统出来println(“您想提取多少?”