在Android中读取文件
我是一个新手程序员。我想从一个文件中读取数据并将它们放在地图上。我想读取一个txt文件,并在后台线程中执行它,下面是我的代码在Android中读取文件,android,android-asynctask,Android,Android Asynctask,我是一个新手程序员。我想从一个文件中读取数据并将它们放在地图上。我想读取一个txt文件,并在后台线程中执行它,下面是我的代码 MyTask mt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_m
MyTask mt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myFragmentManager = getSupportFragmentManager();
mySupportMapFragment = (SupportMapFragment)myFragmentManager.findFragmentById(R.id.map);
myMap = mySupportMapFragment.getMap();
mt = new MyTask();
}
class MyTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
StringBuffer sb = new StringBuffer();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(getAssets().open("example.txt")));
String temp;
while ((temp = br.readLine()) != null)
sb.append(temp);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
String myjsonstring = sb.toString();
try {
JSONObject jsonObjMain = new JSONObject(myjsonstring);
JSONArray jsonArray = jsonObjMain.getJSONArray("results");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
String name = jsonObj.getString("Adres");
JSONObject c = jsonArray.getJSONObject(i);
JSONObject phone = c.getJSONObject("location");
String lat = phone.getString("latitude");
String lon = phone.getString("longitude");
dLat=Double.parseDouble(lat);
dLon=Double.parseDouble(lon);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
myMap.addMarker(new MarkerOptions().position(new LatLng(dLat, dLon)).title(name));
dialog.dismiss();
}
}
MyTask-mt;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myFragmentManager=getSupportFragmentManager();
mySupportMapFragment=(SupportMapFragment)myFragmentManager.findFragmentById(R.id.map);
myMap=mySupportMapFragment.getMap();
mt=新的MyTask();
}
类MyTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
StringBuffer sb=新的StringBuffer();
BufferedReader br=null;
试一试{
br=新的BufferedReader(新的InputStreamReader(getAssets().open(“example.txt”));
字符串温度;
而((temp=br.readLine())!=null)
某人(临时);
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
br.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
字符串myjsonstring=sb.toString();
试一试{
JSONObject jsonObjMain=新的JSONObject(myjsonstring);
JSONArray JSONArray=jsonObjMain.getJSONArray(“结果”);
for(int i=0;i
在真实设备上使用此代码,不会发生任何事情,也不会添加任何点。我的错是什么?好吧,你实例化了一个
MyTask
对象(newmytask()
),把它分配给我认为是整个上下文中的一个成员变量(mt=
),然后就这样了。
这意味着MyTask
对象在mt
变量中被引用,但仅此而已
您需要执行(触发)任务才能运行:
mt.execute();
将这一行放在您希望任务开始的位置
有关AsyncTask
s及其使用方法的详细信息,请参见,其中有明确的说明:
创建后,任务的执行非常简单:
一般来说,一定要先看那里,尤其是你不习惯的Android范例的基本用法
至于
部分,我不知道您对Java泛型有多熟悉,如果不熟悉,您应该先了解一下
这里,AsyncTask
可以定义3件事:它的doInBackGround()
方法接受的参数类型,它的onProgressUpdate()
方法接受的参数类型,最后是它的onProgressUpdate()
方法接受的参数类型和它的doInBackGround()
方法返回
在您的例子中,AsyncTask既不接受也不返回任何参数,因此您只需将这3种类型指定为Void
类型(请参见“为什么”)。您必须指定类型,因为Java是一种强(静态)类型的语言,如果不指定类型,它就无法编译代码
那么这在哪里有用呢?
例如,假设您希望在另一个活动
中执行相同的操作(异步读取文件中的数据),那么您可以在自己的文件中取出MyTask
定义,并在两个活动中重用MyTask
。好的,但是您希望从每个活动中的不同文件加载数据,因此MyTask
实例必须以要读取的文件名作为参数MyTask
doInBackground()
将如下所示:
protected Void doInBackground(String... params) {
final String fileName = params[0]; // note: in real life you should check the arguments are valid first
...
public class MyTask extends AsyncTask<String, Void, Void>
现在您可以看到,它接受类型为String
的参数。为了让编译器理解这一点,并允许活动中的代码在调用execute()
时将String
类型的参数传递给它们的MyTask
实例,MyTask
必须这样声明:
protected Void doInBackground(String... params) {
final String fileName = params[0]; // note: in real life you should check the arguments are valid first
...
public class MyTask extends AsyncTask<String, Void, Void>
公共类MyTask扩展了AsyncTask
否则您将有编译错误
再次检查这些类型参数的更广泛使用。正如用户“desseim”所指出的,您只需要执行以下任务:
mt.execute();
execute方法的参数用于将数据传递给doInBackground()方法重写,可以通过“params”变量获得。如果您不需要从后台任务中操作或访问活动,并且正在为任务使用单独的类文件,那么这样做对您来说是非常有用的。由于您的任务类位于