Мое приложение отлично работает во всех версиях Android, за исключением того, что оно не работает, потому что я делаю сетевые вызовы в основном потоке. Мой код ниже не работает на url.openStream()
, и я думаю, мне нужно сделать этот вызов в отдельном потоке. Кроме того, я создал этот класс Utilities
, чтобы я мог ссылаться на функции, которые я использую во многих частях моего приложения. Я уверен, что я сделал это неправильно, но это было все, что я знал в то время. Я надеюсь, кто-то захочет потратить время, чтобы показать мне, как я должен был это сделать, и как я могу обернуть вызов openStream
в AsyncTask
. Заранее спасибо за вашу помощь. Кроме того, я провел последние несколько дней, пытаясь понять это самостоятельно.
class Utilities {
static XMLReader xr;
static URL url;
private final static int CHUNK_SIZE = 32 * 1024;
static byte[] _fileIOBuffer = new byte[CHUNK_SIZE];
static String DBGetOnlineVersionNumber(final Activity activity){
final String version = null;
try {
/* Create a URL we want to load some xml-data from. */
String location = activity.getString(R.string.version_file_location);
url = new URL(location);
/* Get a SAXParser from the SAXPArserFactory. */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
final XMLVersionReader myExampleHandler = new XMLVersionReader();
xr.setContentHandler(myExampleHandler);
xr.parse(new InputSource(url.openStream())); //Fails here
/* Parsing has finished. */
} catch (Exception e) {
System.out.println("XML Pasing Excpetion = " + e);
}
return version;
}
Теперь, когда вы хорошо поместили свой код в отдельный статический метод, я предполагаю, что более целесообразно использовать его вместо этого. Оставив вас с возможностью вызывать его синхронно или тот же код, можно вызывать из отдельного потока. Обертка вызова в AsyncTask может быть выполнена где-то вокруг этого, если вы добавили в свою активность.
new AsyncTask<Activity, Void, String>() {
@Override
public String doInBackground(Activity... activities) {
return Utilities.DBGetOnlineVersionNumber(activities[0]);
}
@Override
public void onPostExecute(String result) {
Log.d("VERSION_NUMBER", result);
}
}.execute(this);