HttpUrlConnection in AppCompatPreferenceActivity läuft nicht

  • Antworten:19
  • Bentwortet
Andreas Riedl
  • Forum-Beiträge: 33

16.08.2016, 18:54:38 via Website

Hallo Leute,

bin neu hier im Forum. Brauch dringend Hilfe bei einem meiner Projekte. Ich würde gerne wissen was es mit der AppCompatPreferenceActivity auf sich hat. würde gerne eine httpUrl connection machen die unter der besagten activity nicht läuft. Bin kein Profi in sachen android studio. Aber danke im voraus.

— geändert am 16.08.2016, 19:23:07 durch Moderator

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.08.2016, 19:13:48 via App

Hallo Andreas!
Herzlich wilkommen hier im Forum :)
AppCompatPreferenceActivity ist eine normale Preference Activity welche halt kompatibel für Material und API Versionnen kleiner 5.0 ist.
Eigentlich müsste die httpUrl conection da auch gehen.
Was geht denn nicht?
Bekommst du eine Fehlermeldung (LogCat)?
Wie sieht denn deinCode aus?

PS:
Ich habe deinen Threadtitel mal angepasst.
Bitte achte beim nächsten Thread auf einen aussagekräftigeren Titel.
Danke :)

— geändert am 16.08.2016, 19:23:40

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
swa00
  • Forum-Beiträge: 3.704

16.08.2016, 20:32:33 via Website

Hallo Andreas ,

ich gehe schon davon aus , dass in der Manifest

uses-permission android:name="android.permission.INTERNET"

drin ist ..

Ansonsten hatte ich mal Ähnliches , dass ich mit dem Hinzufügen folgender Zeilen gelöst bekommen habe

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

16.08.2016, 20:42:14 via Website

Super danke mal für den Support. Schaffe es heute leider nicht mehr. Werde morgen mal den Code posten. Internet permissions is drin in manifest.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.08.2016, 21:28:48 via App

@swa00: Das abschalten der strict policy ist keine dauerlösung. Ambesten dafür immer einen AsyncTask oder gleich eine externe http lib benutzen.

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00

Antworten
swa00
  • Forum-Beiträge: 3.704

16.08.2016, 21:40:29 via Website

Hallo Pascal ,

jetzt muss ich dich an dieser Stelle doch mal Nerven :-)

Ich hatte erst vor ein paar Tagen genau dieses Problem - OBWOHL ich in einem AsyncTask
den Request ausführe.

@Override
protected JSONObject doInBackground(Void... params)
{
try
{
HttpURLConnection urlConnection = null;
URL url = new URL(this.url);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setReadTimeout(10000 /* milliseconds /);
urlConnection.setConnectTimeout(15000 /
milliseconds */);
urlConnection.setDoOutput(true);
urlConnection.connect();
BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream()));
char[] buffer = new char[1024];
String jsonString = new String();
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {sb.append(line+"\n");}
br.close();
jsonString = sb.toString();
Log.d (TAG,"JSON: " + jsonString);
return new JSONObject(jsonString);
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}

(Hier als Beispiel ein JSON Probe-Request zu ShoutCast)

Ohne StrictMode = Keine Chance (AS meckert) - das Ganze in einem Fragment ( v4)

Könntest du mir bitte erklären , warum du denn überhaupt eine externe lib nimmst ?
Ich habe das nämlich schon des öfteren gelesen, allerdings wurde nirgendwo plausibel erklärt, warum.
Ergo habe ich es erst mal ignoriert.

Wo ist also die Crux ??

Ich Danke dir im Voraus

P.S Wenn du eine externe lib deines Vertrauens einsetzt , dann bitte ich um Mitteilung , welche :-)

— geändert am 16.08.2016, 22:54:44

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.08.2016, 06:56:02 via App

Wie AS meckert?
NetworkOnMainThread Exception?
Das kann nicht sein.
Rufst du auch AsyncTask#execute auf statt die doInBackground?
Das ist wichtig sonst wird kein Thread generiert.

Und ich nurtze eine Lib weil ich keine Lust habe sowas immer selber zu Programmiern. Wenn ich jetzt ümit diesem Code einen allgemeinen HttpClient bastle dann werden das wieder ein paar Klassen ung genug Code da ich z.b. auch noch http post und multipart Upload etc. brauche. Eventuell will ich auch noch mit Cookies arbeiten dann muss das auch noch rein. Die benutzung einer Lib mit welchet so ein Request egal welcher art in 2-3 zeilen zu realisieren ist finde ich da deutlich einfacher.
Zudem habe ich da auch direkt einen Callback, in dem ich die Daten dann weiterverarbeiten kann.
Gute Libs sind z.b. ION;OkHttp;Volley.
Und wenn du eine JsonApi mit den standards hast kannst du auch Retrofit benutzen.

— geändert am 17.08.2016, 07:00:16

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00

Antworten
swa00
  • Forum-Beiträge: 3.704

17.08.2016, 08:29:02 via Website

Moin Pascal ,

natürlich rufe ich einen kompletten AsyncTask auf , sonst hätte ich oben schlecht
"@Override doinBackGround" angeben können :-)

 ////////////////////////////////////////////////////////////////////////////
private class loadGenreList extends AsyncTask<Void, Void, JSONObject>
{
    private String url;
    public loadGenreList()
    {
        this.url = "http://api.shoutcast.com/genre/primary?k="+DEV_ID+"&f=json";
    }

    @Override
    protected JSONObject doInBackground(Void... params)
    {
        try
        {
            HttpURLConnection urlConnection = null;
            URL url = new URL(this.url);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setReadTimeout(10000 /* milliseconds */);
            urlConnection.setConnectTimeout(15000 /* milliseconds */);
            urlConnection.setDoOutput(true);
            urlConnection.connect();
            BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream()));
            char[] buffer = new char[1024];
            String jsonString = new String();
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {sb.append(line+"\n");}
            br.close();
            jsonString = sb.toString();
            Log.d (TAG,"JSON: " + jsonString);
            return new JSONObject(jsonString);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(JSONObject result)
    {
        super.onPostExecute(result);
        try
        {
         JSONObject tag = result.getJSONObject("response").getJSONObject("data").getJSONObject("genrelist");
         JSONArray jsonArray = tag.optJSONArray("genre");
         if (jsonArray != null)
         {
            for (int i = 0; i < jsonArray.length(); i++)
            {
                JSONObject t_jsonObject = jsonArray.getJSONObject(i);
                int id = Integer.parseInt(t_jsonObject.optString("id").toString());
                String name = t_jsonObject.optString("name").toString();
                Log.d(TAG, "Node" + i + " :id= " + id + "  --- " + name);
            }
         }
       } catch (JSONException e) {e.printStackTrace();}
    }
}

Aufruf :

new loadGenreList().execute();

Ich danke Dir für die Libs und der Callback hört sich sehr gewinnbringend an - macht Sinn , was du angibst :-)
Ich stürze mich dann doch mal auf die OKHttp, die scheint irgendwie der Favorit bei vielen zu sein

Lieben Dank an Dich
.
.

@Andreas
Wenn du also deinen Request in einen AsyncTask eingepackt hast , lass meinen oben genannten StrictMode bitte mal weg und schau , ob es dann geht ..

Ansonsten benötigen wir von Dir den Code

— geändert am 17.08.2016, 09:05:51

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

17.08.2016, 18:31:57 via Website

Also das ist mein vorhandener Code in dem ich gerne die Url connection machen will. Habe quasi eine App die meine Heimautomatisierung steuert. Und eine 2te app die einen ColorPicker mit farb auswahl und helligkeit steuert. Jetzt müsste ich "beide apps miteinander verheiraten" Was benötigt ihr das ihr mir helfen könnt?

Der code von der bisherigen Main Activity
enter code here
package com.androidbelieve.drawerwithswipetabs;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.os.Vibrator;
import android.widget.Spinner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
DrawerLayout mDrawerLayout;
NavigationView mNavigationView;
FragmentManager mFragmentManager;
FragmentTransaction mFragmentTransaction;
private WebView webview;

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


    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    mNavigationView = (NavigationView) findViewById(R.id.shitstuff);


    mFragmentManager = getSupportFragmentManager();
    mFragmentTransaction = mFragmentManager.beginTransaction();
    mFragmentTransaction.replace(R.id.containerView, new TabFragment()).commit();


    android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.app_name,
            R.string.app_name);

    mDrawerLayout.setDrawerListener(mDrawerToggle);

    mDrawerToggle.syncState();


}

public void Wohnenlinksauf (View View) {
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    v.vibrate(100);
    new PostClass1 (this).execute();
}

private class PostClass1 extends AsyncTask<String, Void, Void> {

    private final Context context;

    public PostClass1 (Context c){
        this.context = c;
    }

    protected void onPreExecute(){
        progress= new ProgressDialog(this.context);
    }

    @Override
    protected Void doInBackground(String... params) {
        try {

            URL url = new URL("Url die aufgerufenwird");
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("POST");
            final StringBuilder output = new StringBuilder("Request URL " + url);



            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line = "";
            StringBuilder responseOutput = new StringBuilder();
            System.out.println("output===============" + br);
            while((line = br.readLine()) != null ) {
                responseOutput.append(line);
            }
            br.close();

            output.append(System.getProperty("line.separator") + "Response " + System.getProperty("line.separator") + System.getProperty("line.separator") + responseOutput.toString());

            MainActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    progress.dismiss();
                }
            });


        } catch (MalformedURLException e) {

        } catch (IOException e) {

        }
        return null;
    }

    protected void onPostExecute() {
        progress.dismiss();
    }

}
public void Wohnenlinksab (View View) {
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    v.vibrate(100);
    new PostClass2 (this).execute();
}

private class PostClass2 extends AsyncTask<String, Void, Void> {

    private final Context context;

    public PostClass2 (Context c){
        this.context = c;
    }

    protected void onPreExecute(){
        progress= new ProgressDialog(this.context);
    }

    @Override
    protected Void doInBackground(String... params) {
        try {

            URL url = new URL("Url die aufgerufenwird");
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("POST");
            final StringBuilder output = new StringBuilder("Request URL " + url);



            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line = "";
            StringBuilder responseOutput = new StringBuilder();
            System.out.println("output===============" + br);
            while((line = br.readLine()) != null ) {
                responseOutput.append(line);
            }
            br.close();

            output.append(System.getProperty("line.separator") + "Response " + System.getProperty("line.separator") + System.getProperty("line.separator") + responseOutput.toString());

            MainActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    progress.dismiss();
                }
            });


        } catch (MalformedURLException e) {

        } catch (IOException e) {

        }
        return null;
    }

    protected void onPostExecute() {
        progress.dismiss();
    }

}

........

Der Code der AppcompatpreferenceActivity

enter code here

package de.simon_dankelmann.ledcontroller;

import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

/**
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
* to be used with AppCompat.
*/
public abstract class AppCompatPreferenceActivity extends PreferenceActivity {

private AppCompatDelegate mDelegate;

@Override
protected void onCreate(Bundle savedInstanceState) {
    getDelegate().installViewFactory();
    getDelegate().onCreate(savedInstanceState);
    super.onCreate(savedInstanceState);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    getDelegate().onPostCreate(savedInstanceState);
}

public ActionBar getSupportActionBar() {
    return getDelegate().getSupportActionBar();
}

public void setSupportActionBar(@Nullable Toolbar toolbar) {
    getDelegate().setSupportActionBar(toolbar);
}

@Override
public MenuInflater getMenuInflater() {
    return getDelegate().getMenuInflater();
}

@Override
public void setContentView(@LayoutRes int layoutResID) {
    getDelegate().setContentView(layoutResID);
}

@Override
public void setContentView(View view) {
    getDelegate().setContentView(view);
}

@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
    getDelegate().setContentView(view, params);
}

@Override
public void addContentView(View view, ViewGroup.LayoutParams params) {
    getDelegate().addContentView(view, params);
}

@Override
protected void onPostResume() {
    super.onPostResume();
    getDelegate().onPostResume();
}

@Override
protected void onTitleChanged(CharSequence title, int color) {
    super.onTitleChanged(title, color);
    getDelegate().setTitle(title);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    getDelegate().onConfigurationChanged(newConfig);
}

@Override
protected void onStop() {
    super.onStop();
    getDelegate().onStop();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    getDelegate().onDestroy();
}

public void invalidateOptionsMenu() {
    getDelegate().invalidateOptionsMenu();
}

private AppCompatDelegate getDelegate() {
    if (mDelegate == null) {
        mDelegate = AppCompatDelegate.create(this, null);
    }
    return mDelegate;
}

}

Wie gesagt will die beiden apps vereinen. wie rum ist egal. gibt es eine möglichkeit die mainactivity in die appcompatpreferenceactivity zu bekommen oder umgekehrt. Bin jetzt echt kein profi was App Programmieren angeht.
Danke schon mal im vorraus

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.08.2016, 18:44:18 via Website

Gehen tt das schon. Aber ohne das nötige KnowHow deinerseits wohl kaum.
Zuerst einam will ich dir sagen "this code smells" ;)
Soll heißen so programmiert man nicht wirklich.
Ändere deinen AsyncTask in einen eigenen Java File aus und
ändere den Code in der doInBackgound so du die URL als Parameter mitgeben kannst.

Damit ersparst du dir eine AsyncTask klasse für jede URL.
(Sowas wiederspricht übrigens Grundlegend dem OOP Prinzip - ObjectOrientedProgramming)

Dein Code macht mit dem result den du aus dem Web lädst ja garnichts.
Wo verarbeitest du den denn?
Ich denke du musst den String irgendwo zurückgeben ambesten mit einem Callback..
Und warum willst du die beiden Activities jetzt vereinen?
Die PreferenceActivity ist für Einstellungen, da brauchst du doch keine Daten oder sehe ich das falsch.
Beschreib mal genauer was du damit bezwecken willst, do gan hab ich das noch nicht verstanden.
Also bitte erstmal den AsyncTask richtig Programmieren.
Für einen Tipp, schaue hier:
https://www.nextpit.de/forum/568854/tutorial-download-einer-webseite

LG Pascal //It's not a bug, it's a feature. :) ;)

Andreas Riedl

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

17.08.2016, 19:23:40 via Website

Hab einen programmierer der aber nur selten zeit hat. Das mit dem asynchrontask hab ich schon gehört. Will das ja lernen. Hast da eine gute beschreibung. Habe 2 apps die getrennt von einander perfekt laufen. Der color picker und meine heimautomatisierung mit der ich einige server per php anspreche. Der color picker sollte in die heimautomatisierung mit einfliesen. Sprich Tab color picker. Bekomm das mit der appcompatactivity nicht hin.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.08.2016, 19:27:25 via App

Beschreibung hab ich doch schon verlinkt. Siehe oben.
Zum Zusammenfügen:
Du musst die Activity als neue Activity einfügen. Dann kannst du diese aus der Hauptactivity per Intent starten und deine Farbe auswählen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Andreas Riedl

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

17.08.2016, 19:45:29 via Website

Okay da hab ich bisschen was zu lesen am Wochenende. Welche activity als neue activity einfügen?
Sorry hab bei java echt ein Verständnis Problem

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.08.2016, 20:05:41 via App

In deiner ColorPicker App hast du ja eine Activity. Diese kannst du doch einfach in die Automationsapp übernehmen und dann von dort aus dem Main per Intent starten.

— geändert am 17.08.2016, 20:06:46

LG Pascal //It's not a bug, it's a feature. :) ;)

Andreas Riedl

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

17.08.2016, 20:33:06 via Website

Welche activity meinst du die? Die appcompatactivity? Hättest du da evtl ein beispiel. Ich wäre dir so dankbar Pascal.

Antworten
swa00
  • Forum-Beiträge: 3.704

17.08.2016, 21:02:55 via Website

@Andreas

Wenn du nur das brauchst, dann biete ich dir an , das morgen für dich schnell zusammenzuklappern..
Habe dir dazu eine PN geschickt

@Pascal
Danke nochmal . ION habe ich eingebunden - welch Übersicht in meinem Code - JSON und noch Callbacks happy :-)

— geändert am 17.08.2016, 21:11:48

Liebe Grüße - Stefan
[ App - Entwicklung ]

Andreas Riedl

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

18.08.2016, 05:42:50 via Website

Aso PN.Privat Nachricht. Doch habe ich erhalten. Sollte ich dir die Beiden apps schicken?

Antworten
swa00
  • Forum-Beiträge: 3.704

18.08.2016, 07:20:19 via Website

na ansonsten kann ich wohl schlecht aus zwei -> EIns machen ..... :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Andreas Riedl

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

18.08.2016, 12:51:21 via Website

Okay super :D komm leider erst am Abend dazu. Ich glaub deine e-Mail Adresse hast schon geschickt.

Antworten
Andreas Riedl
  • Forum-Beiträge: 33

18.08.2016, 18:59:51 via Website

Also hab dir ne E-Mail mit Link geschickt. Kannst mir vielleicht noch kurz bescheid geben ob mit dem Versand alles geklappt hat?

Antworten