Вы можете написать свой собственный слушатель. Это же, что и ответ HelmiB , но выглядит более естественным:
Создать интерфейс прослушивателя:
public interface myAsyncTaskCompletedListener {
void onMyAsynTaskCompleted(int responseCode, String result);
}
Затем напишите асинхронную задачу:
public class myAsyncTask extends AsyncTask {
private myAsyncTaskCompletedListener listener;
private int responseCode = 0;
public myAsyncTask() {
}
public myAsyncTask(myAsyncTaskCompletedListener listener, int responseCode) {
this.listener = listener;
this.responseCode = responseCode;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String result;
String param = (params.length == 0) ? null : params[0];
if (param != null) {
// Do some background jobs, like httprequest...
return result;
}
return null;
}
@Override
protected void onPostExecute(String finalResult) {
super.onPostExecute(finalResult);
if (!isCancelled()) {
if (listener != null) {
listener.onMyAsynTaskCompleted(responseCode, finalResult);
}
}
}
}
Наконец, выполните прослушивание в действии:
public class MainActivity extends AppCompatActivity implements myAsyncTaskCompletedListener {
@Override
public void onMyAsynTaskCompleted(int responseCode, String result) {
switch (responseCode) {
case TASK_CODE_ONE:
// Do something for CODE_ONE
break;
case TASK_CODE_TWO:
// Do something for CODE_TWO
break;
default:
// Show some error code
}
}
И так вы можете вызвать asyncTask:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Some other codes...
new myAsyncTask(this,TASK_CODE_ONE).execute("Data for background job");
// And some another codes...
}
Это работает на меня в Java 1.5 - я разделил определенные исключения для удобочитаемости.
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
public Document loadXMLFromString(String xml) throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new ByteArrayInputStream(xml.getBytes()));
}
Стоп там!
существует потенциально серьезная проблема с этим кодом, потому что это игнорирует кодировку символов, определенную в String
(который является UTF-8 по умолчанию). Когда Вы звоните String.getBytes()
, кодировка по умолчанию платформы используется для кодирования символов Unicode к байтам. Так, синтаксический анализатор может думать, что это получает данные UTF-8, когда на самом деле это получает EBCDIC или something… не симпатичный!
Вместо этого используйте метод синтаксического анализа, который берет InputSource, который может быть создан с Читателем, как это:
import java.io.StringReader;
import org.xml.sax.InputSource;
…
return builder.parse(new InputSource(new StringReader(xml)));
Это не может походить на грандиозное предприятие, но незнание проблем кодировки символов приводит к коварной гнили кода, сродни двухтысячному году.
Просто имел подобную проблему, кроме мне был нужен NodeList и не Документ, вот то, что я придумал. Это - главным образом то же решение как прежде, увеличенный для снижения корневого элемента как NodeList и предложения erickson's использования использования InputSource вместо этого для проблем кодировки символов.
private String DOC_ROOT="root";
String xml=getXmlString();
Document xmlDoc=loadXMLFrom(xml);
Element template=xmlDoc.getDocumentElement();
NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT);
public static Document loadXMLFrom(String xml) throws Exception {
InputSource is= new InputSource(new StringReader(xml));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
return doc;
}