2016-04-24 84 views
0

我正在开发一个android应用程序,通过php,mysql,json从数据库中检索数据。我需要创建一个服务或任何方法来调用的getData()方法每次10分钟。我试图把这2种方法在广播接收器和用于报警经理每10分钟重复,但它并不能正常运行,它的工作只为吐司Log.d(简单操作)。有没有一种简单的方法来实现我想要的?我做搜索了很多,但无法找到一个明确的答案在后台调用方法来每隔几分钟检索一次数据

//METHOD 1 
private void getData() { 

    loading = ProgressDialog.show(this,"Please wait...","Fetching...",false,false); 

    String url = Config.DATA_URL; 

    StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      loading.dismiss(); 
      showJSON(response); 

     } 
    }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Toast.makeText(MainActivity.this,error.getMessage().toString(),Toast.LENGTH_LONG).show(); 
       } 
      }); 

    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    requestQueue.add(stringRequest); 
} 




// METHOD 2 
private void showJSON(String response){ 

    String id=""; 
    String time=""; 
    String value = ""; 
    try { 

     JSONObject jsonObject = new JSONObject(response); 
     JSONArray result = jsonObject.getJSONArray(Config.JSON_ARRAY); 

     for (int i = 0; i < result.length(); i++) { 
      JSONObject tempData = result.getJSONObject(i); 
      id = tempData.getString(Config.KEY_NAME); 
      time = tempData.getString(Config.KEY_ADDRESS); 
      value = tempData.getString(Config.KEY_VC); 
      String data = "Id:\t"+id+", Time:\t" +time+ ", Value:\t"+ value; 
      all += data+"\n"; 
     } 



    } 

    catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    textViewResult.setText(all); 

} 

回答

1

你使用的广播接收器(BR)和警报管理方式听起来是个好办法,我不知道到底是什么问题,你遇到。你能告诉我们更多吗?

如果没有所有细节,我会说一个潜在的问题是广播接收器通常在Android的UI线程中执行,并且不允许您执行网络访问,并且它必须在X秒内完成。

1)您没有访问互联网正确的权限?从我记得的日志可以很容易错过。 2)要么你可以请求无线局域网运行后台线程,我知道你可以做到,而不是自己尝试。 3)你可以开始另一个线程。正如你所看到的更新UI,你可能应该使用一个异步任务。因此,您可以在后台线程中执行网络,然后您可以在UI线程中使用新数据进行调用。 (这很可能是去选择)

旁注:解析JSON,我建议你看看GSON。这是一个来自谷歌的图书馆,使Json的parsin更简单。 https://github.com/google/gson

0
import com.google.android.gms.gcm.GcmTaskService; 
import com.google.android.gms.gcm.TaskParams; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.location.Address; 
import android.location.Geocoder; 
import android.net.ConnectivityManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.widget.Toast; 

import com.google.android.gms.gcm.GcmNetworkManager; 

import com.google.android.gms.gcm.OneoffTask; 
import com.google.android.gms.gcm.PeriodicTask; 
import com.google.android.gms.gcm.Task; 
import com.rcsplcms.ess.Constant; 
import com.rcsplcms.ess.GPSTracker; 
import com.rcsplcms.ess.R; 
import com.rcsplcms.ess.application.ESSApplication; 
import com.rcsplcms.ess.util.AppLog; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 

import java.util.List; 
import java.util.Locale; 


/** 
* Created by MAYURKUMAR TERAIYA on 20-09-2017. 
*/ 

public class GCMServiceTracking extends GcmTaskService { 


private static final String TAG = GCMServiceTracking.class.getSimpleName(); 

public static final String GCM_ONEOFF_TAG = "oneoff|[0,0]"; 
public static final String GCM_REPEAT_TAG = "repeat|[7200,1800]"; 

@Override 
public void onInitializeTasks() { 
    //called when app is updated to a new version, reinstalled etc. 
    //you have to schedule your repeating tasks again 
    super.onInitializeTasks(); 
} 

@Override 
public int onRunTask(TaskParams taskParams) { 
    //do some stuff (mostly network) - executed in background thread (async) 

    //Toast.makeText(getApplicationContext(), "Service Executed", 
    Toast.LENGTH_SHORT).show(); 

    //obtain your data 
    Bundle extras = taskParams.getExtras(); 

    Handler h = new Handler(getMainLooper()); 
    Log.v(TAG, "onRunTask"); 


    if (taskParams.getTag().equals(GCM_ONEOFF_TAG)) { 
     h.post(new Runnable() { 
      @Override 
      public void run() { 
       //Toast.makeText(GCMServiceTracking.this, "ONEOFF executed", 
     Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } else if (taskParams.getTag().equals(GCM_REPEAT_TAG)) { 
     h.post(new Runnable() { 
      @Override 
      public void run() { 
       //Toast.makeText(GCMServiceTracking.this, "REPEATING executed", Toast.LENGTH_SHORT).show(); 

       gpsTracker = new GPSTracker(GCMServiceTracking.this); 

       Toast.makeText(getApplicationContext(), "Data Syncing.", Toast.LENGTH_SHORT).show(); 


      } 
     }); 
    } 
    return GcmNetworkManager.RESULT_SUCCESS; 
} 



public static void scheduleOneOff(Context context) { 
    //in this method, single OneOff task is scheduled (the target service 
    that will be called is MyTaskService.class) 
    Bundle data = new Bundle(); 
    data.putString("some key", "some budle data"); 
    try { 
     OneoffTask oneoff = new OneoffTask.Builder() 
       //specify target service - must extend GcmTaskService 
       .setService(GCMServiceTracking.class) 
       //tag that is unique to this task (can be used to cancel task) 
       .setTag(GCM_ONEOFF_TAG) 
       //executed between 0 - 10s from now 
       .setExecutionWindow(10, 10) 
       //set required network state, this line is optional 
       .setRequiredNetwork(Task.NETWORK_STATE_ANY) 
       //request that charging must be connected, this line is optional 
       .setRequiresCharging(false) 
       //set some data we want to pass to our task 
       .setExtras(data) 
       //if another task with same tag is already scheduled, replace it with this task 
       .setUpdateCurrent(true) 
       .build(); 
     GcmNetworkManager.getInstance(context).schedule(oneoff); 
     Log.v(TAG, "oneoff task scheduled"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static void scheduleRepeat(Context context) { 
    //in this method, single Repeating task is scheduled (the target service that will be called is MyTaskService.class) 
    try { 
     PeriodicTask periodic = new PeriodicTask.Builder() 
       //specify target service - must extend GcmTaskService 
       .setService(GCMServiceTracking.class) 
       //repeat every 60 seconds 
       .setPeriod(300) 
       //specify how much earlier the task can be executed (in seconds) 
       .setFlex(30) 
       //tag that is unique to this task (can be used to cancel task) 
       .setTag(GCM_REPEAT_TAG) 
       //whether the task persists after device reboot 
       .setPersisted(true) 
       //if another task with same tag is already scheduled, replace it with this task 
       .setUpdateCurrent(true) 
       //set required network state, this line is optional 
       .setRequiredNetwork(Task.NETWORK_STATE_ANY) 
       //request that charging must be connected, this line is optional 
       .setRequiresCharging(false) 
       .build(); 
     GcmNetworkManager.getInstance(context).schedule(periodic); 
     Log.v(TAG, "repeating task scheduled"); 
    } catch (Exception e) { 
     Log.e(TAG, "scheduling failed"); 
     e.printStackTrace(); 
    } 
} 

public static void cancelOneOff(Context context) { 
    GcmNetworkManager 
      .getInstance(context) 
      .cancelTask(GCM_ONEOFF_TAG, GCMServiceTracking.class); 
} 

public static void cancelRepeat(Context context) { 
    GcmNetworkManager 
      .getInstance(context) 
      .cancelTask(GCM_REPEAT_TAG, GCMServiceTracking.class); 
} 

public static void cancelAll(Context context) { 
    GcmNetworkManager 
      .getInstance(context) 
      .cancelAllTasks(GCMServiceTracking.class); 
} 

}

// CODE FOR START BACKGROUND TASK 

GoogleApiAvailability api = GoogleApiAvailability.getInstance(); 
Int errorCheck = api.isGooglePlayServicesAvailable(LoginActivity.this); 

      if(errorCheck == ConnectionResult.SUCCESS) { 
        //google play services available, hooray 
       } else if(api.isUserResolvableError(errorCheck)) { 
        //GPS_REQUEST_CODE = 1000, and is used in onActivityResult 
        api.showErrorDialogFragment(LoginActivity.this, errorCheck, GPS_REQUEST_CODE); 
        //stop our activity initialization code 
        return; 
       } else { 
        //GPS not available, user cannot resolve this error 
        //todo: somehow inform user or fallback to different 
        method 
        //stop our activity initialization code 
        return; 
} 

GCMServiceTracking.scheduleRepeat(LoginActivity.this); 


GRADLE FILE 
compile 'com.google.android.gms:play-services:8.3.0' 

MENIFEST FILE 
    <service 
     android:name=".services.GCMServiceTracking" 
     android:exported="true" 
     android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> 
     <intent-filter> 
      <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" /> 
     </intent-filter> 
    </service>