Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中读取文件_Android_Android Asynctask - Fatal编程技术网

在Android中读取文件

在Android中读取文件,android,android-asynctask,Android,Android Asynctask,我是一个新手程序员。我想从一个文件中读取数据并将它们放在地图上。我想读取一个txt文件,并在后台线程中执行它,下面是我的代码 MyTask mt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_m

我是一个新手程序员。我想从一个文件中读取数据并将它们放在地图上。我想读取一个txt文件,并在后台线程中执行它,下面是我的代码

          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”变量获得。如果您不需要从后台任务中操作或访问活动,并且正在为任务使用单独的类文件,那么这样做对您来说是非常有用的。由于您的任务类位于