onPostExecute()不会将意图发送到背景

时间:2015-05-27 07:33:12

标签: android android-intent android-asynctask

我在后台遇到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!!!");

            }

        }

    }

}

2 个答案:

答案 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 -