在AsyncTask Android中读取文件

谢尔盖·斯维特洛夫(Sergey Svetlov)

我是新手程序员。我想从文件中读取数据并将其放在地图上。我想读取一个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对象(new MyTask()),并将其分配给我认为整个上下文中的成员变量(mt =),仅此而已。这意味着MyTaskmt变量中引用对象,仅此而已。

您需要执行(触发)该任务才能运行:

mt.execute();

将此行放在您希望任务开始的位置。

有关s及其使用方法的详细信息,请参见Android文档AsyncTask

创建完成后,任务将非常简单地执行:

new DownloadFilesTask().execute(url1, url2, url3);

通常,请始终先查看那里,尤其是对于您不习惯的Android范例的基本用法。


至于<Void, Void, Void>部分,我不知道你是多么熟悉Java泛型,如果不是你应该先推出的概念

这里的AsyncTask罐中定义3个东西:类型其参数的doInBackGround()方法接受的类型的参数及其onProgressUpdate()方法接受,并且最后的类型及其参数的onProgressUpdate()方法接受及其doInBackground()方法返回。

在您的情况下,您的AsyncTask既不接受也不返回任何参数,因此您只需将这3种类型指定为Void类型(有关原因,请参阅另一个SO问题)。必须指定类型,因为Java是一种强(静态)类型的语言,否则您将无法编译代码。

那么,这在哪里有用呢?假设您要在另一个Activity实例中执行相同的操作(异步地从文件中读取数据),然后可以将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
    ...

现在,您看到它接受类型为的参数String为了使编译器能够理解这一点,并允许活动中的代码在调用类型的参数传递String给其MyTask实例execute()MyTask则必须这样声明:

public class MyTask extends AsyncTask<String, Void, Void>

否则,将会有编译错误。

再次检查Android文档,以更广泛地使用这些类型参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

试图在android中的AsyncTask中读取文本文件,但我得到空结果

来自分类Dev

如何使用AsyncTask在具有Android Studio的Internet中读取文件?

来自分类Dev

Android:在AsyncTask中敬酒

来自分类Dev

AsyncTask中的Android AlertDialog

来自分类Dev

AsyncTask中的android动画

来自分类Dev

Android中AsyncTask的参数

来自分类Dev

关于Android中的AsyncTask

来自分类Dev

asynctask读取阻止

来自分类Dev

AsyncTask下载zip文件android

来自分类Dev

在Fragment android中实现AsyncTask

来自分类Dev

在Android中定期运行asynctask

来自分类Dev

声明中的Android AsyncTask错误

来自分类Dev

声明中的Android AsyncTask错误

来自分类Dev

在片段android中实现AsyncTask

来自分类Dev

Android:AsyncTask中的setText(“ Loading ...”)

来自分类Dev

Android中的AsyncTask永远循环

来自分类Dev

android AsyncTask类中的NullPointerException

来自分类Dev

Android AsyncTask中的甜蜜警报

来自分类Dev

Android中的AsyncTask不会退出

来自分类Dev

Android 中 AsyncTask 的布尔返回

来自分类Dev

AsyncTask and JSON - Android

来自分类Dev

Android AsyncTask冻结UI

来自分类Dev

Android AsyncTask参数

来自分类Dev

Android,Singleton AsyncTask

来自分类Dev

Android最佳实践AsyncTask

来自分类Dev

Android AsyncTask / doInBackground模式

来自分类Dev

android Sqlite IllegalStateException在AsyncTask

来自分类Dev

Android AsyncTask多次运行

来自分类Dev

Android AsyncTask等到完成