我在后台遇到onPostExecute()
的问题,所以我每30秒向服务器发送一次long, lat, mac
等数据,然后回复结果为:
{
"status":230,
"routes":[9, 11],
"distance":293.3018920430205
}
当app在前面运行时(数据传递给onNewIntent方法)正在处理好的但是当它在后台运行时,数据没有传递给{{1}中的onNewIntent
完全没有。
当应用程序在后台运行时,如何才能将路径和距离发送到MainActivity
?
MainActivity
一些MainActivity代码:
public class PostData {
String jSONString;
// Context mContext;
public PostData() {
super();
}
public String getjSONString() {
return jSONString;
}
public void setjSONString(String jSONString) {
this.jSONString = jSONString;
}
public void post_data(String jSONString, Context context) {
this.jSONString = jSONString;
new MyAsyncTask(context).execute(jSONString);
//new MyAsyncTask(context).cancel(true);
}
class MyAsyncTask extends AsyncTask<String, Integer, Void> {
final Context mContext;
ArrayList<Integer> routes = new ArrayList<Integer>();
double distance;
public MyAsyncTask(Context context) {
mContext = context;
}
@Override
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
BufferedReader reader = null;
try {
System.out.println("The output of : doInBackground "
+ params[0]);
URL myUrl = new URL(
"https://tracker.rhcloud.com/webapi/test");
HttpURLConnection conn = (HttpURLConnection) myUrl
.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
conn.setRequestProperty("Content-Type", "application/json");
conn.connect();
// System.out.println("The output of getResponsecode: "
// + conn.getResponseCode());
// create data output stream
DataOutputStream wr = new DataOutputStream(
conn.getOutputStream());
wr.writeBytes(params[0]);
wr.close();
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
Gson gson = new Gson();
StopsJSON data = gson.fromJson(sb.toString(), StopsJSON.class);
routes = data.getRoutes();
distance = data.getDistance();
System.out.println("The output of the StringBulder: "
+ sb.toString());
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (reader != null) {
try {
reader.close();
return null;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Intent with Conetxt of the Asyntask class and
if (routes != null && !routes.isEmpty()) {
// if(routes !=null ){
Intent intent = new Intent(mContext, MainActivity.class);
intent.putIntegerArrayListExtra("stop_route", routes);
intent.putExtra("stop_distance", distance);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
mContext.startActivity(intent);
} else {
Log.e("123", "Avoiding null pointer, the routes are null!!!");
}
}
}
}
答案 0 :(得分:2)
活动并不意味着在后台运行。改为使用服务。
此外,onNewIntent仅在Activity的实例已存在时调用,并且它具有在AndroidManifest.xml中设置的正确标志或启动它的意图。
答案 1 :(得分:0)
Activity是带有UI的Android组件。原因UI占用大量内存Android框架停止并清除所有与UI相关的组件,当应用程序转到后台以释放内存时 - 只要AsyncTask从它启动,您的活动就会停止。因此,如果您需要在后台完成任务,则必须使用另一个不需要UI的Android组件 - 服务。
要从此后台服务启动活动,您需要使用PendingIntent。并且,为了使用此后台任务的结果更新UI,您的Activity可以绑定到服务器,或者您可以使用Messenger从服务到Activity进行通信。或者您的服务可以将结果存储在ContentProvider或数据库中,然后您的活动可以从中获取所需的任何信息。另外考虑使用某种EventBus - Otto或GreenBus -