Kotlin Volley - приложение вылетает с ошибкой при доступе к залпу из другого класса - PullRequest
0 голосов
/ 07 марта 2019

У меня только два файла в проекте LoginActivity.kt & ApiActivity.kt.Loin Activity будет вызывать функцию с именем get(), которая находится внутри ApiActivity, функция get() просто сделает простой вызов GET и вернет значение.

Это то, что у меня есть в LoginActivity.kt

val api = com.sa.sa.ApiActivity();
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        this.getToken();
    }
private fun getToken() {
var response = this.api.get ();
        Toast.makeText(this@LoginActivity,  response, Toast.LENGTH_SHORT).show();
}

И это то, что у меня есть в ApiActivity.kt

fun get () : String {
        var result : String = "Test";
        val queue = Volley.newRequestQueue(this);
        var url = getString(R.string.api_url)+getString(R.string.api_getToken);
        val stringRequest = StringRequest(Request.Method.GET, url,
            Response.Listener<String> { response ->
                result = response;
            },
            Response.ErrorListener {
                result = "Error";
            })
        queue.add(stringRequest);
        return result;
    }

В среде IDE не отображается ошибка, нокогда я пытаюсь запустить приложение, оно показывает следующую ошибку и вылетает приложение

Attempt to invoke virtual method 'java.io.File android.content.Context.getCacheDir()' on a null object reference

Примечание: У меня нет макета для ApiActivity.kt, и у меня нетonCreate тоже.Я разместил все коды, которые у меня есть.

В чем причина сбоя приложения или что я делаю неправильно.

1 Ответ

2 голосов
/ 07 марта 2019

Вы не должны делать ApiActivity деятельностью вообще.

class LoginActivity {
   fun getData(context : Context) : String {
    var result : String = "Test";
    val queue = Volley.newRequestQueue(context);
    var url = context.getString(R.string.api_url) + context.getString(R.string.api_getToken);
    val stringRequest = StringRequest(Request.Method.GET, url,
        Response.Listener<String> { response ->
            result = response;
        },
        Response.ErrorListener {
            result = "Error";
        })
    queue.add(stringRequest);
    return result;
   } 
}

В LoginActivity назовите его

var response = this.api.getData(this);
Toast.makeText(this@LoginActivity,  response, Toast.LENGTH_SHORT).show();

Также не является ли StringRequest метод асинхронным? В этом случае вы всегда получите "Test" обратно.

...