Połącznie z Aplikacją Webową

0

Cześć,
Mam następujący problem. Postawiłem aplikację webową pod adresem http://squashleague.alwaysdata.net/articles która zwraca artykuły. Następnie napisałem funkcję która ma łączyć się z tą aplikacją i zwracać listę obiektów typu artykuł. Funkcja ta działa w 100% jak ją uruchamiam przez intelij. Niestety wykorzystując ją w aplikacji w android studio nie działa. Czy ktoś może podpowiedzieć dlaczego może mi to nie działać. (dodam że internet na emulatorze działa)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor


public class Article {
    private int id;
    private String title;
    private String content;
}
import com.example.logowanie.entity.Article;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.net.URL;
import java.util.List;



public class ApiArticleConector {


    public static String test (){
        List<Article> articles = null;
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            articles = objectMapper.readValue(new URL("http://squashleague.alwaysdata.net/articles"), new TypeReference<List<Article>>() {});
            return "articles found";
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        }
    }

    public static List<Article> downloadArticle (){
        List<Article> articles = null;
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            articles = objectMapper.readValue(new URL("http://squashleague.alwaysdata.net/articles"), new TypeReference<List<Article>>() {});
        } catch (Exception e) {
            e.printStackTrace();

        }
        return articles;
    }
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
    .(reszta manifestu)

0

To nie do końca wygląda jak aplikacja pisana dla androida.
Czy możesz pokazać activity i kod który wykonuje zapytanie sieciowe?

0

A co nie działa?

0

Oczekiwałem na próbę, że wyświetli mi tą listę w "Toast". I wychodzi na to że nie jest w stanie pobrać tej listy. W tym przekładzie używam funkcji test bo chwiałem zobaczyć czy w ogóle się ta funkcja wywołuje, bo mi całą aplikacje wcześniej wywalało. wcześniaj miałem ApiArticleConector.downloadArticle().toString i mi aplikacje wywalało (bo nie potrafił pobrać listy a nie miałem elsa), ale nie wiem dlaczego mi nie pobiera tych artykułów.

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import com.example.logowanie.service.ApiArticleConector

class MainActivity : AppCompatActivity() {
    var btLogowanieNormal : Button? = null
    var btLogowanieFacebook : Button? = null
    var btLogowanieGoogle : Button? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        menu()
    }


    fun menu(){
        btLogowanieNormal = findViewById(R.id.bt_login_normal)
        btLogowanieFacebook = findViewById(R.id.bt_login_facebook)
        btLogowanieGoogle = findViewById(R.id.bt_login_google)

        btLogowanieNormal?.setOnClickListener {
            val intent = Intent(this, HomeActivity::class.java)
            startActivity(intent)
        }
        btLogowanieFacebook?.setOnClickListener {
            val intent = Intent(this, HomeActivity::class.java)
            startActivity(intent)
        }
        btLogowanieGoogle?.setOnClickListener {
            Toast.makeText(this, ApiArticleConector.test(), Toast.LENGTH_SHORT).show()  ///////tu się odwołuje do tej funkcji////
            val intent = Intent(this, HomeActivity::class.java)
            startActivity(intent)
        }
    }
}
2

Nie możesz zrobić zapytania sieciowego na głównym wątku. Musisz użyć czegoś w stylu AsyncTask, Coroutines, RxJava, Volley. Cokolwiek co pozwoli wykonać zapytanie w innym wątku niż main

0

Ale to, że nie wykonuje zapytania na osobnym wątku powoduje ten błąd? Myślałem że to się wykona tylko po prostu zablokuje chwilowo aplikację. Dzięki za podpowiedź spróbuję to zrobić na wątku (chciałem go dodać ale najpierw próbowałem zobaczyć czy się uda mi połączyć :) )

2

Twój try catch w test() łapie ten wyjątek i wyświetla go w LogCat. Stąd pewnie brak crasha i brak wykonania zapytania. Zobacz w LogCat i znajdź stacktrace

0

java.io.IOException: Cleartext HTTP traffic to squashleague.alwaysdata.net not permitted

Ok dzięki za podpowiedź chyba to ogarnąłem. Faktycznie po zmianie z http na https nie rzuca tego wyjątku, tylko teraz "android.os.NetworkOnMainThreadException" czyli ten o wątku głównym, więc po naprawie powinno zadziałać :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.