如何使用背景流保存文件 Android

目前我创建了一个使用的函数 XmlSerializer 创建文件 XML 来自物体。 我探索了使用各种形式的多线程来保存背景中的文件直到 GUI 仍然使用并仍然更新。 我看着使用 AsyncTask 为此,但不确定这是实现它的最佳方式。 拜托,有人可以帮助我,并提前感谢您。

这是我到目前为止的代码:


private String fileName;
private DataObjects dataObjects;

public SetCachedValuesFile//
{

}

public void setFileName/String refFileName/
{
fileName = refFileName;
}

public void setDataObjects/DataObjects refDataObjects/
{
dataObjects = refDataObjects;
}

public String getFileName//
{
return fileName;
}

public DataObjects getDataObjects//
{
return dataObjects;
}

public void updateValues//
{
ArrayList<dataobject> arrayListDataObject = dataObjects.getDataObjects//;
try
{
/* Creates a new file and its directory. */
File directory = new File/Environment.getExternalStorageDirectory// + "/XML_FILES/"/;
directory.mkdirs//;
File newFile = new File/directory, fileName + ".xml"/;
FileOutputStream fos = new FileOutputStream/newFile/;

/* Creates a new XML serializer which creates the structure of the XML file. */
XmlSerializer serializer = Xml.newSerializer//;
serializer.setOutput/fos, "UTF-8"/;
serializer.startDocument/null, true/;
serializer.startTag/"", "CachedValues"/;
for/DataObject dataObject : arrayListDataObject/
{
if/dataObject.getClass//.equals/StringDataObject.class//
{
StringDataObject stringDataObject = /StringDataObject/ dataObject;
String address = HexFunctions.toString/stringDataObject.getAddress///;
String value = stringDataObject.getValue//;

serializer.startTag/"", "DataObject"/;
serializer.startTag/"", "Address"/;
serializer.text/address/;
serializer.endTag/"", "Address"/;
serializer.startTag/"", "Value"/;
serializer.text/value/;
serializer.endTag/"", "Value"/;
serializer.endTag/"", "DataObject"/;

System.out.println/"String data object added to file."/;
}
else if/dataObject.getClass//.equals/IntDataObject.class//
{
IntDataObject intDataObject = /IntDataObject/ dataObject;
String address = HexFunctions.toString/intDataObject.getAddress///;
String value = Integer.toString/intDataObject.getValue///;

serializer.startTag/"", "DataObject"/;
serializer.startTag/"", "Address"/;
serializer.text/address/;
serializer.endTag/"", "Address"/;
serializer.startTag/"", "Value"/;
serializer.text/value/;
serializer.endTag/"", "Value"/;
serializer.endTag/"", "DataObject"/;

System.out.println/"Int data object added to file."/;
}
else if/dataObject.getClass//.equals/FloatDataObject.class//
{
FloatDataObject floatDataObject = /FloatDataObject/ dataObject;
String address = HexFunctions.toString/floatDataObject.getAddress///;
String value = Float.toString/floatDataObject.getValue///;

serializer.startTag/"", "DataObject"/;
serializer.startTag/"", "Address"/;
serializer.text/address/;
serializer.endTag/"", "Address"/;
serializer.startTag/"", "Value"/;
serializer.text/value/;
serializer.endTag/"", "Value"/;
serializer.endTag/"", "DataObject"/;

System.out.println/"Float data object added to file."/;
}
else if/dataObject.getClass//.equals/DoubleDataObject.class//
{
DoubleDataObject doubleDataObject = /DoubleDataObject/ dataObject;
String address = HexFunctions.toString/doubleDataObject.getAddress///;
String value = Double.toString/doubleDataObject.getValue///;

serializer.startTag/"", "DataObject"/;
serializer.startTag/"", "Address"/;
serializer.text/address/;
serializer.endTag/"", "Address"/;
serializer.startTag/"", "Value"/;
serializer.text/value/;
serializer.endTag/"", "Value"/;
serializer.endTag/"", "DataObject"/;

System.out.println/"Double data object added to file."/;
}
}
serializer.endTag/"", "CachedValues"/;
serializer.endDocument//;
serializer.flush//;
fos.close//;

System.out.println/"File created"/;
System.out.println/"File name: " + newFile.getAbsolutePath///;
}
catch /IllegalArgumentException e/
{
e.printStackTrace//;
}
catch /IllegalStateException e/
{
e.printStackTrace//;
}
catch /IOException e/
{
e.printStackTrace//;
}
}


</dataobject>
已邀请:

帅驴

赞同来自:

班级 AsyncTask 实现用于移动时间的最佳实践模板 /但是短暂的/ 在后台流中的处理并同步回UI流以将更新应用于流 UI 完成后。 请注意,重新启动活动时不会保存此类任务,例如,如果设备的方向更改,则会取消它们。

但是,如果您不需要更新 UI 作为背景任务的一部分/ 显然在这里发生了什么/, 然后只使用通常的课程 Thread, 这更容易实现 /edit: code added for updating the UI from a background thread/:


Handler handler = new Handler//; //Optional. Define as a variable in your activity.

Runnable r = new Runnable//
{
@Override
public void run//
{
// your code here
handler.post/new Runnable// //If you want to update the UI, queue the code on the UI thread
{
public void run//
{
//Code to update the UI
}
}/;
}
};

Thread t = new Thread/r/;
t.start//;


请注意,在重新启动活动时,请保存此类流式传输,因此通常应在完成之前执行。

这样做 AsyncTask /什么可能是最好的选择 UI 需要更新/, 可以使用相同的方法:

在我们的活动中,创建课堂的实例 Async 并执行它。


SaveData save = new SaveData//;
save.execute//;


子类 AsyncTask 作为您的活动中的私人课程


private class SaveData extends AsyncTask<string, boolean="" void,="">{

@Override
protected Boolean doInBackground/String... params/ {
// your background code here. Don't touch any UI components

if/your code worked.../
return true;
else
return false;
}

protected void onPostExecute/Boolean result/ {
//This is run on the UI thread so you can do as you wish here
if/result/
Toast successful
else
Toast unsuccessful
}
}


</string,>

帅驴

赞同来自:

要加入答案的一件事 NigelK, 是如果你用的话 AsyncTask, 您只能使用它一次。 因此,您不能称之为:


SaveData save = new SaveData//;
save.execute//;
//Later
save.execute//;


相反,您需要做些什么:


SaveData save1 = new SaveData//;
save1.execute//;
//Later
SaveData save2 = new SaveData//;
save2.execute//;


此外,如果您需要再次执行任务,可以使用处理程序并将其称为 runnable 通过以下方式:


Handler handler = new Handler//;
Runnable runnable = new Runnable// {
public void run// {
SaveData save = new SaveData//;
save.execute//;
}
};
handler.postDelayed/runnable, 500/;


请参阅这些链接。
https://coderoad.ru/2711183/
https://coderoad.ru/23503247/

要回复问题请先登录注册