Fehlermeldung in AS : Was bedeutet "incompatible Types" ?

  • 22 Antworten
  • Neuester Beitrag
Diskutiere Fehlermeldung in AS : Was bedeutet "incompatible Types" ? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
P

Peter200980

Ambitioniertes Mitglied
Hallo Zusammen,

ich bekomme folgende Fehlermeldung:
Code:
Error:(28, 33) error: incompatible types: Locations cannot be converted to Context
Diese Meldung bezieht sich auf folgende Zeile:
Code:
new Downloader(Locations.this,urlAddress,lv).execute();
Der Fehler ist dadurch entstanden, weil ich zuerst die Klasse Locations als Klasse verwendet habe, sie nun jedoch als Fragment verwenden muss, weil dies sonst nicht mit meinem Navigation Drawer kompatibel ist.
Anbei der Komplette Code des Fragments Location:
Code:
public class Locations extends Fragment {
    final static String urlAddress = "http://partypeople.bplaced.net/lol.php";

    public Locations() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ListView lv = (ListView) getView().findViewById(R.id.lv);
        new Downloader(Locations.this,urlAddress,lv).execute();
        return inflater.inflate(R.layout.fragment_locations, container, false);


    }
}
Schöne Grüße
Peter
 
swa00

swa00

Moderator
Teammitglied
Hallo Peter,

der Fehler beruht darauf , dass Location.this kein Context ist
und dein Task "Downloader" einen Parameter von Typ Context benötigt.

Warum du letztendlich deinem Task einen Context übergeben musst, weisst nur du
 
Zuletzt bearbeitet:
P

Peter200980

Ambitioniertes Mitglied
Hallo Stefan,
das konnte ich durch Tante Google auch schon einmal recherchieren. Anbei siehst du die Download klasse. Hast du eine Idee, wie ich das lösen könnte. Weil ohne den Context funktioniert meine Download Klasse nicht mehr :(
Code:
public class Downloader extends AsyncTask<Void,Void,String> {
    Context c;
    String urlAddress;
    ListView lv;
    SwipeRefreshLayout swipeRefreshLayout;
    ProgressDialog pd;

    public Downloader(Context c, String urlAddress, ListView lv) {
        this.c = c;
        this.urlAddress = urlAddress;
        this.lv = lv;
        this.swipeRefreshLayout = swipeRefreshLayout;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        if(!swipeRefreshLayout.isRefreshing())
        {
            swipeRefreshLayout.setRefreshing(true);
        }

        pd=new ProgressDialog(c);
        pd.setTitle("Retrieve");
        pd.setMessage("Retriving Wait");
        pd.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        return this.downloadData();
    }

    @Override
    protected void onPostExecute(String jsonData) {
        super.onPostExecute(jsonData);

        pd.dismiss();
        if(jsonData==null)
        {
            swipeRefreshLayout.setRefreshing(true);
            Toast.makeText(c,"Unable to connect to DB",Toast.LENGTH_SHORT);
        }else{
            new DataParser(c,jsonData,lv).execute();
        }
    }
    private String downloadData()
    {
        HttpURLConnection con=Connector.connect(urlAddress);

        if(con==null){
            return null;
        }

        try {
            InputStream is=new BufferedInputStream(con.getInputStream());
            BufferedReader br= new BufferedReader(new InputStreamReader(is));

            String line;
            StringBuffer jsonData=new StringBuffer();

            while((line=br.readLine()) !=null)
            {
                jsonData.append(line+"\n");
            }
            br.close();
            is.close();

            return jsonData.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
 
swa00

swa00

Moderator
Teammitglied
Hallo Peter,

hier ist dein Constructor, der dein Context verlangt, der dann wiederum den Context später noch verwendet

public Downloader(Context c, String urlAddress, ListView lv)
Du musst diesem also einen gültigen Context übergeben, weil in PostExecute wiederum ein Task
gestartet wird.

Um zu sagen welcher Context , vermag hier leider keiner zu beurteilen , weil man dein gesamtes Konzept nicht
einsehen kann.

Hast du diesen Task selbst geschrieben , oder nur Copy & Paste ?

Ich wundere mich eben , warum das so kompliziert gemacht wurde und nicht mit Volley,ION, oder Vergleichbares.
 
Zuletzt bearbeitet:
P

Peter200980

Ambitioniertes Mitglied
Hallo Stefan,

ich habe den Task selbst geschrieben, mich hierbei aber sehr stark an einem InternetArtikel orientiert.
Ich habe hierfür leider kein Vorwissen, deshalb musste ich mich daran orientieren und weiss aufgrund dessen auch keine Lösung für mein Problem. Vielleicht könntest du mir helfen. Brauchst du noch weitere Informationen etc?
 
swa00

swa00

Moderator
Teammitglied
Grundsätzlich ist das , was du da oben gebaut hast vom Ansatz nicht falsch.
Es ist halt seeeeehr rudimentär.

Man sieht schon , dass das Ganze keine klare Linie hat .- Deshalb auch meine Frage auch an Dich :)

Gerade URl-Request als Anfänger sind einer der grössten Herausforderungen an die man sich dransetzten sollte.
Da sollte man schon wirklich fit sein.

Das mag zwar im Ansatz funktionieren , fängt allerdings fast nichts ab ,
was so auf dem Wege übers Netz passieren kann.

Ich würde Dir empfehlen , mal die ION Library zu verwenden. Die Jungs bei solchen Libraries sind
fit indem was sie da bauen. Wenn du in deren Code reinschaust, wirst du schon nachvollziehen können,
was ich meine.

GitHub - koush/ion: Android Asynchronous Networking and Image Loading

P.S und das Ganze baut man nicht direkt in eine onCreateView eines Fragmentes ein .
Du solltest dem System erst mal Luft lassen , seine UI aufzubauen
 
Zuletzt bearbeitet:
P

Peter200980

Ambitioniertes Mitglied
Hallo Stefan,

kleine Frage: wozu soll ich die ION Libary verwenden?
Soll jetzt keine negativ gemeinte Frage sein, nur welche Vorteile bietet mir diese Libary, weil ich viel mehr Informationen über meine vorgehensweise finde :)
Und die zweite Frage wäre dann, wie ich, egal welche vorgehensweise ich nutze es in ein Fragment packe.
Schöne Grüße
 
swa00

swa00

Moderator
Teammitglied
Soll jetzt keine negativ gemeinte Frage sein,
Mach dir keinen Kopp drum , wir "arbeiten" ja hier zusammen :)

kleine Frage: wozu soll ich die ION Libary verwenden?
Das hatte ich bereits oben erklärt .
Weil diese Libraries dir alle erdenklichen Fehler & Abstürze etc , die in der Übertragung
im Netz vorkommen können, bereits abfangen.

Hast du mal in die Library reingeschaut ?
Die sind sowas von trivial, gemacht , dass du mit ledglich ein paar Zeilen Dein Json schon da hast ,
Warum also den Aufwand treiben , dem du eh noch nicht mächtig bist ?

Beispiel :
Code:
JsonObject json = new JsonObject();
Ion.with(context)
.load("http://partypeople.bplaced.net/lol.php")
.setJsonObjectBody(json)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>()
 {
   @Override
    public void onCompleted(Exception e, JsonObject result)
   {
        // VOILA - Dein Json -  FERTIG !!
    }
});
Das funktioniert überall, egal Fragment, Activity, Klasse, SingleTon etc

Nur zur Info : Für so etwas setze ich selbst nur Libraries ein.
Den eigenen Aufwand betreibe ich auch nicht, solange es nichts Spezielles ist

Als "Beginner" würde ich dir empfehlen AsyncTasks eher auf andere Dinge anzuwenden und nicht direkt mit Net-Requests.
 
Zuletzt bearbeitet:
P

Peter200980

Ambitioniertes Mitglied
Hallo Stefan,

ich hab mir den Link in deiner vorherigen Nachricht angeschaut, aber leider ist dort nur der Quellcode und keinerlei erklärungen :(. Hättest du weitere Informationen, wie ich die Libary anstatt meiner vorgehensweise anwende?
-- Dieser Beitrag wurde automatisch mit dem folgenden Beitrag zusammengeführt --
Bist du der Meinung, ich soll es mit einem Volley machen?
 
swa00

swa00

Moderator
Teammitglied
Öhm,

scroll mal bitte durch - das sind gefühlte 50 Beispiele

Mein Beispiel ist auch von der Seite (Copy & Paste nur mit Deinem Link versehen)

Und es steht auch dabei , wie man es einbindet (Gradle)

Volley, OkHttp, Ion - das was dir mehr zusagt - ich verwende ION
 
markus.tullius

markus.tullius

Experte
Mache es ist mit Volley. Ist zur Zeit von Google favorisierte Weg für Internetkommunikation.

Mit den vorgeschlagenen Libraries ist aber das eigentliche Problem nicht gelöst. Past und Copy macht nur Sinn, wenn man den Code auch versteht. Auch wenn du das Beispiel von swa00 benutzt, solltest Du Dich unbedingt mit Task und Thread beschäftigen. Selbst wenn man Ion oder Volley benutzt gibt immer noch Fallstricke, die zu einem Absturz führen können (z.B nicht beendete Streams).

Processes and Threads | Android Developers
 
P

Peter200980

Ambitioniertes Mitglied
Hallo Zusammen,

nun hat Stefan mich darauf hingewiesen, dass ich in diesem Threat mein Problem nun erneut schildere:)
ich habe folgendes Problem:
Zuerst war das derzeitige Fragment eine Activity, d.h. folgende Zeile wurde angewendet:
new Downloader(Locations_main.this,urlAddress,lv).execute();
Da ich jetzt ein Fragment verwende, meckert AS folgendes: Error:(31, 38) error: incompatible types: Locations_main cannot be converted to Context
diese Meldung bezieht sich auf meine Downloader Activity, welche Ihr anbei zusätzlich findet:

Code:
public class Downloader extends AsyncTask<Void,Void,String> {
    Context c;
    String urlAddress;
    ListView lv;
    ProgressDialog pd;


    public Downloader(Context c, String urlAddress, ListView lv) {
        this.c = c;
        this.urlAddress = urlAddress;
        this.lv = lv;

    }



    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pd=new ProgressDialog(c);
        pd.setTitle("Locations werden geladen");
        pd.setMessage("Locations werden geladen");

        pd.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        return this.downloadData();
    }

    @Override
    protected void onPostExecute(String jsonData) {
        super.onPostExecute(jsonData);

        pd.dismiss();
        if(jsonData==null)
        {

            Toast.makeText(c,"Unable to connect to DB",Toast.LENGTH_SHORT);
        }else{
            new DataParser(c,jsonData,lv).execute();
        }
    }
    private String downloadData()
    {
        HttpURLConnection con=Connector.connect(urlAddress);

        if(con==null){
            return null;
        }

        try {
            InputStream is=new BufferedInputStream(con.getInputStream());
            BufferedReader br= new BufferedReader(new InputStreamReader(is));

            String line;
            StringBuffer jsonData=new StringBuffer();

            while((line=br.readLine()) !=null)
            {
                jsonData.append(line+"\n");
            }
            br.close();
            is.close();

            return jsonData.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
Über einen Lösungsvorschlag würde ich mich sehr freuen :)
 
markus.tullius

markus.tullius

Experte
Locations_main.this erbt nicht von Context. Spricht der Task erwartet, etwas vom Typ Context, Location_main ist aber nicht vom Typ Context, dass führt zum Fehler in der Zeile:
new Downloader(Locations_main.this,urlAddress,lv).execute();
 
markus.tullius

markus.tullius

Experte
Das habe ich glatt übersehen. :smile:
 
swa00

swa00

Moderator
Teammitglied
@markus.tullius

... das war eher ein Hinweis für ihn , nicht für Dich :)
 
Zuletzt bearbeitet:
P

Peter200980

Ambitioniertes Mitglied
Hallo Zusammen, danke für die schnelle Antwort. Ich habe diese Antwort schon gelesen, aber ich weiss nicht, was ich verändern soll, damit es klappt. Vielleicht habt Ihr hierfür einen Hinweis für mich :)
 
swa00

swa00

Moderator
Teammitglied
Hallo Peter ,

das ist jetzt schon das zweite mal , dass du diesen Link erhälst. :)
Fragment | Android Developers

Magst du eventuell unsere Hilfe nicht immer komplett lesen ? :)

Ansonsten : Context / Activity gehören eigentlich zum Basiswissen
 
Zuletzt bearbeitet:
P

Peter200980

Ambitioniertes Mitglied
Hallo Stefan,
ich habe nun folgendes versucht:
new Downloader(Locations_main.getContext(),urlAddress,lv).execute();
Funktioniert leider auch nicht. Habe ich etwas falsch gemacht?
 
markus.tullius

markus.tullius

Experte
Um Dir das zu sagen, veröffentliche bitte die Zeile, wo steht:

public class Location_main ....

Und die Methode getContext().

Danke.
 
Ähnliche Themen - Fehlermeldung in AS : Was bedeutet "incompatible Types" ? Antworten Datum
2
1