gpt4 book ai didi

android - 从网络中提取内容的最佳实践?

转载 作者:行者123 更新时间:2023-11-29 14:10:12 26 4
gpt4 key购买 nike

我是开发 Android 应用程序的新手,在学校只有一点点 Java 经验。当我在寻找 Android 初学者组时,我从 Google 组页面被重定向到 StackOverflow。我有一个问题,关于从 Web 源中提取内容并解析它的最佳做法是什么。

首先,我最终想让我的应用程序线程化(通过使用 Handler?),但是,我现在的问题是我创建的用于连接和获取内容的类(服务器)经常无法检索内容,这导致我的 JSON 解析器类 (JSONParser) 失败,并且我的 View 不显示任何内容。在导航到上一个 Activity 并尝试在同一远程 URI 上调用 connect()、fetch() 和 parse() 方法后,它将起作用。

为什么这种情况(有时会检索远程数据)有时发生,但并非总是如此?什么是最佳实践,包括使用 ProgressDialog 和内部 Handler 类,以使我的应用程序对用户无缝。这是问这个问题的最佳地点吗?感谢您的帮助

这是我现在使用的代码。

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.util.ByteArrayBuffer;

import android.util.Log;

public class Server {

public static final String HTTP_PROTOCOL = "https://";
public static final String EXAMPLE_NET_DOMAIN = "example.domain.net/";
private final String API_KEY = "1234567890";
private static final String API_ENDPOINT = "api.js?";
public final String FORMAT = "json";

public String API_VERSION;
public String METHOD;
public String OPTIONAL_ARGUMENTS;

public String json;
public URL jURL;
public URLConnection jConnection;
public BufferedReader jIn;
public InputStream is = null;



/**
* @param aPIVERSION
* @param mETHOD
* @param oPTIONALARGUMENTS
*/
public Server(String aPIVERSION, String mETHOD, String oPTIONALARGUMENTS) {
super();
API_VERSION = aPIVERSION;
METHOD = mETHOD;
OPTIONAL_ARGUMENTS = oPTIONALARGUMENTS;

connect();
Log.i("DEBUG:","connect();");
}

/**
* @param aPIVERSION
* @param mETHOD
*/
public Server(String aPIVERSION, String mETHOD) {
super();
API_VERSION = aPIVERSION;
METHOD = mETHOD;
OPTIONAL_ARGUMENTS = "";

connect();
}

/**
* @param aPIVERSION
* @param mETHOD
*/
public void connect(){

try {
jURL = new URL(HTTP_PROTOCOL
+ EXAMPLE_NET_DOMAIN
+ API_ENDPOINT
+ "api=" + this.API_VERSION
+ "&method=" + this.METHOD
+ "&format=" + FORMAT
+ "&apikey=" + API_KEY
+ this.OPTIONAL_ARGUMENTS);

jConnection = jURL.openConnection();

} catch (IOException e) {

Log.e("USER: ", "Error in server connection.");
Log.e("DEBUG:", "Error in server connection");
}
Log.i("USER: ", "Connection success!");
}


public String fetch() {

try {
is = jConnection.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("DEBUG:", "fetch-1() error");
}
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);

int current = 0;
try {
while((current = bis.read()) != -1){
baf.append((byte)current);
}
Log.i("DEBUG:",new String(baf.toByteArray()));

} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("DEBUG:","fetch() ERROR!");
}

/* Convert the Bytes read to a String. */
Log.i("DEBUG:",new String(baf.toByteArray()));
return new String(baf.toByteArray());

}

/* Returns a string containing a concise, human-readable description of jURL
*
*/
public String showUrl() {
return jURL.toExternalForm();
}

}

和我的 ListActivity 中的代码

/* Called when the activity is starting. This is where most initialization should go: calling setContentView(int) to inflate the activity's UI, using findViewById(int) to programmatically interact with widgets in the UI, calling managedQuery(android.net.Uri, String[], String, String[], String) to retrieve cursors for data being displayed, etc. 
* @see android.app.Activity#onCreate()
*/
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i("LIFECYCLE: ", "RS.class onCreate()");

Server serverConnection = new Server(API_VERSION, METHOD, OPTIONAL_ARGUMENTS);

json = serverConnection.fetch();

JSONParser jParser = new JSONParser(json);

groupData = jParser.parseJsonForRecentShowList();

SimpleAdapter adapter = new SimpleAdapter( this, groupData, android.R.layout.simple_list_item_2, new String[] { "venue","showdate"},
new int[]{ android.R.id.text2, android.R.id.text1 } );
setListAdapter( adapter );

registerForContextMenu(getListView());

}

这是我的 JSON 解析器类

/**
*
*/

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


/**
* @author
*
*/
public class JSONParser {

public List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();

private String jString;
private Map<String, String> group;
private JSONArray jArray;
private String setlistData;
public String notesString = "";

public String[] splitSetsArray;
public String[] splitEncoreArray;
public String[] extraWork;
public String[] notesArray;

public String pVenue_text;
public String pCity_text;
public String pState_text;
public String pCountry_text;
public String pDate_text;

public String pSet1_text;
public String pSet2_text;
public String pSet3_text;
public String pEncore1_text;
public String pEncore2_text;
public String pNotes_text;

public int totalNumberOfSets;
public int totalNumberOfEncores;
public int totalNumberOfNotes;

public JSONObject jObject;


public JSONParser(String json) {
// TODO Auto-generated constructor stub
jString = json;
}

/**
* @return
*/
public List<Map<String, String>> parseJsonForRecentShowList(){

try {
jArray = new JSONArray(jString);

for(int i=0;i<jArray.length();i++) {
jObject = jArray.getJSONObject(i);

group = new HashMap<String, String>();
group.put("showdate", jObject.getString("showdate"));
group.put("venue", jObject.getString("venue"));
groupData.add(group);
}
} catch (JSONException e) {
Log.e("DEBUG: ", "JSON Parse error!");
}
return groupData;
}

/**
*
*/
public void parseJsonForSetlistData(){
if(jString != null){
try {
jArray = new JSONArray(jString);

jObject = jArray.getJSONObject(0);

pVenue_text = jObject.getString("venue") ;
pCity_text = jObject.getString("city") + ", " ;
pState_text = jObject.getString("state") + ", " ;
pCountry_text = jObject.getString("country") ;
pDate_text = jObject.getString("nicedate") ;

setlistData = nohtml(jObject.getString("setlistdata"));

splitSetsArray = setlistData.split("Set..:.");
totalNumberOfSets = splitSetsArray.length-1;

String[] splitEncoreArray = splitSetsArray[splitSetsArray.length-1].split("Encore:.");
totalNumberOfEncores = splitEncoreArray.length-1;
splitSetsArray[splitSetsArray.length-1] = splitEncoreArray[0];
splitEncoreArray[0] = "";

extraWork = splitEncoreArray[splitEncoreArray.length-1].split("\\[1\\]");

notesArray = extraWork[extraWork.length-1].split("\\[.\\]");
totalNumberOfNotes = notesArray.length-1;
splitEncoreArray[splitEncoreArray.length-1] = extraWork[0];
//notesArray[0] = "";

for(int i=0;i<notesArray.length;i++){
int number = i+1;
notesString += "["+number+"] "+notesArray[i] + "\n";
}

if(totalNumberOfSets != 0) {
pSet1_text = "Set 1: " + splitSetsArray[1];
if (totalNumberOfSets > 1){
pSet2_text = "Set 2: " + splitSetsArray[2];
} else {
pSet2_text = "";
}
if (totalNumberOfSets > 2){
pSet3_text = "Set 3: " + splitSetsArray[3];
} else {
pSet3_text = "";
}
}

pEncore1_text = "Encore: " + splitEncoreArray[1];
if (totalNumberOfEncores > 1) {
pEncore2_text = "Encore 2: " + splitEncoreArray[2];
} else {
pEncore2_text = "";
}
pNotes_text = notesString;

Log.e("DEBUG: ", "JSON Parsed!");

} catch (JSONException e) {

Log.e("ERROR:","caught JSON Exception at parseForSetlistData()");

}

} else {

Log.e("ERROR:", "jString = null");
pVenue_text = "I'm Sorry, the Setlist Data could not be retrieved from server. Please try again.";

}

}

public void parseJsonForReviews(){
try {
jArray = new JSONArray(jString);

for(int i=0;i<jArray.length();i++){
jObject = jArray.getJSONObject(i);

group = new HashMap<String, String>();
group.put("author", jObject.getString("author"));
group.put("review", jObject.getString("review"));
groupData.add(group);
}
} catch (JSONException e) {
Log.e("DEBUG: ", "JSON Reviews parse error!");
}

}

public List<Map<String, String>> parseJsonForYears(){
try {
jArray = new JSONArray(jString);

for(int i=0;i<jArray.length();i++){
JSONObject jObject = jArray.getJSONObject(i);
group = new HashMap<String, String>();
group.put("showdate", jObject.getString("showdate"));
group.put("venue", jObject.getString("venue"));
groupData.add(group);
}
} catch (JSONException e) {
Log.e("DEBUG: ", "JSON Years parse error!");
}

Collections.reverse(groupData);

return groupData;
}

public String nohtml(String json){
return json.toString().replaceAll("\\<.*?>", "");
}

}

最佳答案

好吧,没有任何错误日志,很难猜出您的问题可能是什么。

但是,如果您使用 AndroidHttpClient,您的运气可能会更好为您的连接。它在恢复/重试方面做得很好。

此外,关于多线程,AsyncTask是一个很好的起点。

我的 ShortcutLink 应用程序,可在 github 上找到,可能会让您提前了解如何使用它们。

编辑

您可以尝试使用 java2s.com 中的以下代码将 InputStream 直接转换为 String .

public static String convertStreamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
return sb.toString();
}

关于android - 从网络中提取内容的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3825752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com