java - 从哪里开始异步任务 - Android

标签 java android multithreading android-asynctask

我仍在学习 Java/Android 开发,我需要一些指导来实现异步任务。我主要不确定在我的程序中从哪里开始。我在下面概述了一些代码,有人可以告诉我在哪里以及如何执行任务吗?我的应用程序每秒将 GPS 坐标发送到数据库,我需要一个单独的任务,这样我就不会陷入主线程并冒 ARN 错误的风险。这是我的代码:

第一个区 block 来 self 的主要 Activity 。当按下按钮时,启动三秒倒计时,当它完成时(onFinish)将用户数据发送到一个数据库(SendUserActivity.sendId...,这实际上是一个类,而不是一个 Activity ,只是命名不好)然后应用程序开始跟踪用户并每秒将坐标发送到不同的数据库(location.startLocation...)(两个数据库以避免重复所有的用户数据)。

主要 Activity .java:

public void onFinish() {
   button.setText("SENT");  
   SendUserActivity.sendId(usr_id1, first, last);                   
   location.startLocation(getBaseContext(), usr_id1);

这是来自 LocationActivity 类的第二个代码块(也是一个类而不是一个 Activity ,又是糟糕的命名)。它每秒请求一次位置更新,然后将其发布到将其插入 MySQL 数据库的 PHP 脚本。

public class LocationActivity {

    private LocationManager locManager;
    private LocationListener locListener;

    public void startLocation(Context context, String usr_id2)
    {   
        final String usr = usr_id2;

    //get a reference to the LocationManager
    locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);


    //checked to receive updates from the position
    locListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            send(location, usr);
        }
        public void onProviderDisabled(String provider){
            //labelState.setText("Provider OFF");
        }
        public void onProviderEnabled(String provider){
            //labelState.setText("Provider ON ");
        }
        public void onStatusChanged(String provider, int status, Bundle extras){
            //Log.i("", "Provider Status: " + status);
            }
        };
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locListener);
    }

    public void send(Location loc, String usr_id2) {

         Log.i("", String.valueOf(loc.getLatitude() + " - " + String.valueOf(loc.getLongitude())));

         String lat = String.valueOf(loc.getLatitude()); 
         String lon = String.valueOf(loc.getLongitude());

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://example.com/test/example.php");

         try {
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
           nameValuePairs.add(new BasicNameValuePair("lat", lat)); 
           nameValuePairs.add(new BasicNameValuePair("lon", lon));
           nameValuePairs.add(new BasicNameValuePair("id", usr_id2));
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           httpclient.execute(httppost);
         } 
         catch (ClientProtocolException e) {
             // TODO Auto-generated catch block
         } 
         catch (IOException e) {
             // TODO Auto-generated catch block
         }
    }
}

重申一下我的问题,我将如何实现异步任务以将 GPS 信息发送到数据库?我读过 IntentServices,但有些人建议我使用异步任务。无论哪种方式,让我知道在哪里以及如何实现其中之一;我真的很感激。谢谢!

最佳答案

在这种情况下,基本上您将发送方法包装到 asynctask 的 doInBackground() 方法中,并且 onPostExecute(...) 中的结果将被设置为D B。如果愿意,可以将 AsyncTask 设为内部类。有很多关于如何创建 AsyncTask 的示例。 这里例如只是一个问题

Using AsyncTask with database

Android AsyncTask and SQLite DB instance .

这个网站有很好的教程 http://www.vogella.de/articles/AndroidPerformance/article.html

当然还有 Mark Murphy 的 (CommonsWare) https://github.com/commonsguy/cw-lunchlist/blob/master/15-Internet/LunchList/src/apt/tutorial/FeedActivity.java


干杯

关于java - 从哪里开始异步任务 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9514470/

相关文章:

java - 如何设置主线程的堆栈大小

java线程15分钟后不运行

java - 使用循环排列来降低旅行商的复杂性

javascript - 如何使用 ScriptEngine 从 Java 调用 ajax 来调用 javascript 函数?

java - jGRASP 支持 Java lambda 表达式吗?

java - 为什么注释属性 Rest.rootUrl 的值必须是常量表达式?

java - 避免 Android 中 EditText 的解析错误

java - 如何在 Activity 之间传递 Jsoup Elements 对象?

java - 如何在浏览器中运行 Java 小程序 : "Class Not Found exception"

multithreading - SQLite3 中表的线程安全和并发修改