bir parametre olarak işlevini geçirerek Android framework ve Java ile aşina alıyorum ve sadece web sayfalarını aramak için izin veren ağ kodunun çoğunu işleyecek genel bir "NetworkHelper" sınıfı oluşturmak istedim. http://developer.android.com/training/basics/network-ops/connecting.htmljava
Kodu: Etkinliğimi sınıfta
package com.example.androidapp;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.util.Log;
/**
* @author tuomas
* This class provides basic helper functions and features for network communication.
*/
public class NetworkHelper
{
private Context mContext;
public NetworkHelper(Context mContext)
{
//get context
this.mContext = mContext;
}
/**
* Checks if the network connection is available.
*/
public boolean checkConnection()
{
//checks if the network connection exists and works as should be
ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
{
//network connection works
Log.v("log", "Network connection works");
return true;
}
else
{
//network connection won't work
Log.v("log", "Network connection won't work");
return false;
}
}
public void downloadUrl(String stringUrl)
{
new DownloadWebpageTask().execute(stringUrl);
}
//actual code to handle download
private class DownloadWebpageTask extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... urls)
{
// params comes from the execute() call: params[0] is the url.
try {
return downloadUrl(urls[0]);
} catch (IOException e) {
return "Unable to retrieve web page. URL may be invalid.";
}
}
// Given a URL, establishes an HttpUrlConnection and retrieves
// the web page content as a InputStream, which it returns as
// a string.
private String downloadUrl(String myurl) throws IOException
{
InputStream is = null;
// Only display the first 500 characters of the retrieved
// web page content.
int len = 500;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();
Log.d("log", "The response is: " + response);
is = conn.getInputStream();
// Convert the InputStream into a string
String contentAsString = readIt(is, len);
return contentAsString;
// Makes sure that the InputStream is closed after the app is
// finished using it.
} finally {
if (is != null) {
is.close();
}
}
}
// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException
{
Reader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result)
{
//textView.setText(result);
Log.v("log", result);
}
}
}
kullandığım bu şekilde sınıfını
benim ağ sınıfı oluşturmak için developer.android.com bu makaleyi takip :connHelper = new NetworkHelper(this);
...
if (connHelper.checkConnection())
{
//connection ok, download the webpage from provided url
connHelper.downloadUrl(stringUrl);
}
Sorun şu ki, bir şekilde geri arama yapmam gerekiyor ve "downloadUrl()" işlevinde tanımlanmalıdır. Örneğin, indirme bittiğinde, public void "handleWebpage (String data)" aktivitesindeki işlev, parametresi olarak yüklü dizeyle çağrılır.
Bazı çalışmalar yaptım ve bu işlevselliği sağlamak için bir şekilde arayüzler kullanmam gerektiğini öğrendim. Birkaç benzer stackoverflow soruları/cevaplarını gözden geçirdikten sonra çalışmayı başaramadım ve arayüzleri düzgün bir şekilde anladığımdan emin değilim: How do I pass method as a parameter in Java? Anonim sınıfları kullanarak dürüst olmak benim için yeni ve nerede ve nasıl emin değilim belirtilen koddaki örnek kod parçacıklarını uygulamalıdır.
Benim sorum, geri arama işlevini ağ sınıfımma nasıl iletebileceğimi ve indirme bittikten sonra nasıl arayabileceğimi anlatıyor? Arabirim bildirimi nereye gider, anahtar kelime vb. Uygular? Lütfen Java ile yeni başlayan biri olduğumu unutmayın (diğer programlama arka planınız olsa da), bu yüzden bir açıklama için minnettarım :) Teşekkürler!
sayesinde bu sorunu çözmek için bana yardımcı oldu ve ben şimdi arayüzleri genel java programlama önemli bir rol oynamaktadır nasıl İlginç – Tumetsu
görmek :) arayüzleri temellerini anlamak düşünüyorum. –
Bu, java 8 ... –