我對Android框架和Java很熟悉,想要創建一個通用的「NetworkHelper」類,它將處理大部分網絡代碼,使我能夠從中調用網頁。在java中傳遞函數作爲參數
我跟着本文從developer.android.com創建我的網絡課程:http://developer.android.com/training/basics/network-ops/connecting.html
代碼:
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);
}
}
}
在我的活動I類使用類這樣:
connHelper = new NetworkHelper(this);
...
if (connHelper.checkConnection())
{
//connection ok, download the webpage from provided url
connHelper.downloadUrl(stringUrl);
}
問題我遇到的情況是,我應該以某種方式回調活動,並且它應該在「downloadUrl()」函數中定義。例如,當下載完成時,活動中的public void「handleWebpage(String data)」函數將以加載的字符串作爲參數進行調用。
我做了一些Google搜索,發現我應該以某種方式使用接口來實現此功能。在回顧了幾個類似的stackoverflow問題/答案後,我沒有得到它的工作,我不知道我是否正確理解接口:How do I pass method as a parameter in Java?說實話,使用匿名類對我來說是新的,我不確定我在哪裏或如何應該在提到的線程中應用示例代碼片段。
所以我的問題是如何將回調函數傳遞給我的網絡類並在下載完成後調用它?接口聲明去的地方,實現關鍵字等等? 請注意,我是Java初學者(雖然有其他編程背景),所以我會很感激整個解釋:)謝謝!
謝謝,這幫助我解決了這個問題,我想我現在瞭解接口的基礎知識:) – Tumetsu
有趣的是,看看接口如何在一般的java編程中發揮重要作用。 –
這是之前Java 8 ... –