Diskuze: Android - získání dat z webové stránky
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
pro android by měla fungovat knihovna stejně jako pro normální javu jsoup, která je na tyto věci suprová. Určitě se na ni podívej. Nezapomněl jsi povolit v manifestu internet ? Pokud jsi ho nepovolil, tak je to tím.
Pokud jsi ho neměl povolený, tak by ti to nefungovalo taky. Těch chyb tam budeš mít viditelně více. Můžeš mi teda nasdílet celý tvůj kód včetně manifestu ?
Ještě jsem se o něco pokoušel, to ale také nevyšlo (od toho
commons-io jsem opustil).
Takže aktuální MainActivity.java:
package ...;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Získání dat ze serveru
try {
URL url = new URL("...");
HttpURLConnection data = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(data.getInputStream());
// Zpracování dat
BufferedReader bReader = new BufferedReader(new InputStreamReader(in, "utf-8"), 8);
StringBuilder sBuilder = new StringBuilder();
String line = null;
while ((line = bReader.readLine()) != null) {
sBuilder.append(line + "\n");
}
// Nahrání dat do textu
String dataArticles = sBuilder.toString();
TextView articles = (TextView) findViewById(R.id.articles);
articles.setText(dataArticles);
} catch (IOException e) {
TextView articles = (TextView) findViewById(R.id.articles);
articles.setText("Nastala chyba při získávání dat.");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="..." >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="..." >
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
zkus tady tohle... vždycky jsem uses permission dával před application, ale nevím, jestli je to ta chyba, kvůli které to nefunguje.
Aplikace hned po spuštění napíše "Aplikace přestala pracovat" a spadne to.
Potřebuješ pracovat s HttpURLConnection knihovnou ? Nechceš zkusit jsoup ? Tady s tímto ti moc neporadím. Vždycky, když pracuji s webem, tak to dělám přes jsoup.
Momentálně mám tento kód (zkouším teda ten jsoup, tamto jsem vzdal):
package ...;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
public class MainActivity extends ActionBarActivity {
String url = "...";
ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button articlesButton = (Button) findViewById(R.id.articlesButton);
// Nastavení akce pro tlačítko
articlesButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// Získání dat
new Title().execute();
}
});
}
// Titulek stránky
private class Title extends AsyncTask<Void, Void, Void> {
String title;
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setTitle(R.string.app_name);
mProgressDialog.setMessage("Načítání...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
// Připojení se ke stránce
Document document = Jsoup.connect(url).get();
// Získá titulek stránky
title = document.title();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
TextView articles = (TextView) findViewById(R.id.articles);
articles.setText(title);
mProgressDialog.dismiss();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Mám i stáhnutý jsoup a je ve složce libs. Načítání
dat ale stejně nefunguje - ať se pokouším o popis stránky či titulek, nic
to nevrací. Pokud ale proměnnou title naplním textem "Hello world",
text se vypíše.
To je hrozný to získávání dat z webu.
Aha, mně zrovna nešel internet. Tak už to konečně funguje. Díky za pomoc.
Aha Tak to bude ono Jinak jestli se chceš tomu věnovat, tak bych doporučil dělat v tom jsoup, jak jsi to udělal teď naposledy. Je to hodně propracovaná knihovna a je podle mě o dost lepší než ta, co jsi tam měl předtím.
Zobrazeno 15 zpráv z 15.