【问题标题】:Disabling Re-execution of Async Task on finishing of foreground activity在前台活动完成时禁用异步任务的重新执行
【发布时间】:2013-06-03 19:28:38
【问题描述】:

案例: 我正在使用 Async Task 来显示一些列表。当我单击列表视图的任何项目时,另一个活动将出现在最后一个活动的前景中。此前台 Activity 包含一个完成按钮,通过该按钮前台 Activity 完成。

问题: 当我按下完成按钮时,前台活动完成,但具有异步任务的最后一个活动再次执行。

需要: 我希望当我按下完成按钮时,只有前台活动完成,而具有异步任务的后台活动不得再次执行。该后台活动必须与打开前台活动之前相同。

编辑: 具有异步任务的第一类

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.restaurant_detail);
    Intent i = getIntent();
    res_id = i.getStringExtra("id");
    gps = new GPSTracker(getApplicationContext());
    session = new SessionManagement(getApplicationContext());
    fillDatabase = new DatabaseHandler(getApplicationContext());
    fillDatabase.open();
    count = fillDatabase.fetchCount();
    SetUpViews();
    SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
    Date d = new Date();
    dayOfTheWeek = sdf.format(d);
    Log.i("WEEKDAY", dayOfTheWeek);
    imageLoader = new ImageLoader(getParent());
    progressDialog = ProgressDialog.show(getParent(), "", "Loading...");
    Log.v(String.valueOf(count), "count");
    // new MenuTask().execute();
    new DetailsTask().execute();


}
public class DetailsTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... arg0) {
        // Creating JSON Parser instance//////////
        JSONParser jParser = new JSONParser();
        // Getting JSON String from URL..............
        JSONObject jObject = jParser
                .getJSONFromUrl("http://smartaway.dk/json/rest_get_details.php?id="
                        + res_id);
        try {
            // /Getting array of Events.......
            details = jObject.getJSONArray(TAG_NODE);
            // / LOOping through AllEvents........
            for (int i = 0; i < details.length(); i++) {
                JSONObject e = details.getJSONObject(i);
                res_id = e.getString(TAG_ID);
                res_name = e.getString(TAG_RESNAME);
                logo = e.getString(TAG_RES_LOGO);
                name = e.getString(TAG_RESNAME);
                city_state = e.getString(TAG_CITY);
                street = e.getString(TAG_STREET);
                localityString = e.getString(TAG_LOCALITY);
                restype = e.getString(TAG_RESTYPE);
                Log.v(restype, "restype");
                lat = e.getString(TAG_LAT);
                Log.v(lat, "latitude");

                lng = e.getString(TAG_LNG);
                Log.v(lng, "longitude");
                cuisineString = e.getString(TAG_COUSINE);
                timingsString = e.getString(TAG_TIMING);
                // costString = e.getString(TAG_COSRTWO);

                res_des_String = e.getString(TAG_RES_DES);

                cardString = e.getString(TAG_CARDS);
                facilitiesString = e.getString(TAG_FACILITIES);

                parkingString = e.getString(TAG_PARKING);
                minorderString = e.getString(TAG_MINORDER);
                deliverychargesString = e.getString(TAG_DELIVERY_CHARGES);
                ratings = e.getString(TAG_RATING);
                smily = e.getString(TAG_SMILY);
                s_o_t = e.getString(TAG_S_O);
                s_c_t = e.getString(TAG_S_C);
                m_o_t = e.getString(TAG_M_O);
                m_c_t = e.getString(TAG_M_C);
                t_o_t = e.getString(TAG_T_O);
                t_c_t = e.getString(TAG_T_C);
                w_o_t = e.getString(TAG_W_O);
                w_c_t = e.getString(TAG_W_C);
                th_o_t = e.getString(TAG_TH_O);
                th_c_t = e.getString(TAG_TH_C);
                f_o_t = e.getString(TAG_F_O);
                f_c_t = e.getString(TAG_F_C);
                sat_o_t = e.getString(TAG_SAT_O);
                sat_c_t = e.getString(TAG_SAT_C);
                smily = e.getString(TAG_SMILY);

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
        // progressBar.setVisibility(View.GONE);
        progressDialog.dismiss();
        detail.setVisibility(View.VISIBLE);
        imageLoader.DisplayImage(logo, reslogo);
        resname.setText(StringEscapeUtils.unescapeHtml(name));
        toptxt.setText(StringEscapeUtils.unescapeHtml(name));
        address.setText(StringEscapeUtils.unescapeHtml(street) + " \n"
                + StringEscapeUtils.unescapeHtml(localityString) + " "
                + StringEscapeUtils.unescapeHtml(city_state));
        cuisineString = (cuisineString.equals("") ? "Not present"
                : StringEscapeUtils.unescapeHtml(cuisineString));
        cuisine.setText(cuisineString);
        if (dayOfTheWeek.equalsIgnoreCase("monday")) {
            timings.setText(m_o_t + " - " + m_c_t);

        } else if (dayOfTheWeek.equalsIgnoreCase("tuesday")) {
            timings.setText(t_o_t + " - " + t_c_t);
        } else if (dayOfTheWeek.equalsIgnoreCase("wednesday")) {
            timings.setText(w_o_t + " - " + w_c_t);
        } else if (dayOfTheWeek.equalsIgnoreCase("thursday")) {
            timings.setText(th_o_t + " - " + th_c_t);
        } else if (dayOfTheWeek.equalsIgnoreCase("friday")) {
            timings.setText(f_o_t + " - " + f_c_t);
        } else if (dayOfTheWeek.equalsIgnoreCase("saturday")) {
            timings.setText(sat_o_t + " - " + sat_c_t);
        } else if (dayOfTheWeek.equalsIgnoreCase("sunday")) {
            timings.setText(s_o_t + " - " + s_c_t);
        }
        // costfortwo.setText(costString);
        res_des_String = (res_des_String.equals("") ? "Not present"
                : StringEscapeUtils.unescapeHtml(res_des_String));
        cardString = (cardString.equals("") ? "Not present"
                : StringEscapeUtils.unescapeHtml(cardString));
        parkingString = (parkingString.equals("") ? "Not present"
                : StringEscapeUtils.unescapeHtml(parkingString));
        facilitiesString = (facilitiesString.equals("") ? "Not present"
                : StringEscapeUtils.unescapeHtml(facilitiesString));
        minorderString = (minorderString.equals("") ? "Not present"
                : StringEscapeUtils.unescapeHtml(minorderString));
        deliverychargesString = (deliverychargesString.equals("") ? "Not present"
                : StringEscapeUtils.unescapeHtml(deliverychargesString));

        res_description.setText(res_des_String.replaceAll(
                "(\r\n\t|\n\t|\n|\t)", ""));
        cards.setText(cardString);
        facilities.setText(facilitiesString);

        parking.setText(parkingString);
        minoredr.setText(minorderString);
        delivery_charges.setText(deliverychargesString);
        if (ratings.equals("")) {
            rating.setVisibility(View.GONE);
        } else {
            DecimalFormat numberFormat = new DecimalFormat("##.##");
            rating.setText(numberFormat.format(Double.valueOf(ratings)));
        }
        if (smily.equals("1")) {
            smiley.setImageResource(R.drawable.happy_smile);
        } else if (smily.equals("0")) {
            smiley.setImageResource(R.drawable.sad_smile);
        } else {
            smileyLayout.setVisibility(View.GONE);
        }

    }
}

第二类有完成按钮

setContentView(R.layout.submenulist);

    Intent i = getIntent();
    main_menu = i.getStringExtra("id");
    res_id = i.getStringExtra("res_id");
    res_name = i.getStringExtra("res_name");
    Log.v("Main Menu Name", main_menu);
    fillDatabase = new DatabaseHandler(getApplicationContext());
    fillDatabase.open();
    count = fillDatabase.fetchCount();


    backButton = (Button) findViewById(R.id.finish);
    backButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
        }
    });



}

第二个活动有按钮按下该前台活动完成但在完成该后台活动后调用 Acync Task 再次执行。如何解决这个问题。

非常感谢

【问题讨论】:

  • 您能否为以下内容发布一些代码:您的 AsyncTask 代码,您如何启动前台活动,以及您的 AndroidManifest 中活动的launchMode
  • 当我从前台活动按下返回按钮时,我不希望 Asych 任务再次执行。我没有代码但想知道它的概念
  • @verybadalloc 代码已发布。请看一看。
  • @bakriOnFire 代码已发布。请看一看。

标签: android android-asynctask android-activity activity-lifecycle


【解决方案1】:

然后在第一个活动的 oncreate 方法中启动您的异步任务,当第二个活动开始时,第一个活动将成为前台,当可见第二个活动 finjsh 时,第一个活动将不会重新创建它只会恢复暂停活动,以便您在 oncreate 中调用 asynctask 它不会再次启动线程

【讨论】:

  • 是的,你是对的,但我在 oncreate 中调用执行,然后在完成前台活动后,它再次执行
  • 关于完成前台活动是第一个活动还是第二个活动?
  • 这是不可能的,因为第一个活动 onresume 方法将被调用而不是 oncreate buddy,并且当你在 oncreate 中启动 asynctask 时它不会再次调用。
  • 您是否尝试过代码,您只是想在下面的评论中明确概念
  • 为此制作程序...等等
【解决方案2】:

这是你应该使用单例类实现的目标

  1. 创建一个类说 DataManager

    public class DataManager {
    public static DataManager dManager;
    
    boolean isDataRecieved;
    
    public static DataManager getInstance()
    {
        if(dManager!=null)
            return dManager;
    
        else
            dManager=new DataManager();
    
        return dManager;
    }
    
    }
    

这里的 getInstance 方法确保这个类只有一个对象,并且布尔值 解析和存储数据后,应立即将 isDataRecieved 设置为 true。

喜欢在你的 ASyncTask 的 postExecute 添加这些行

Datamanager d=Datamanager.getInstance();
d.isDataRecieved=true;

现在在 onCreate 添加这些行

Datamanager d=Datamanager.getInstance();
if(!d.isDataRecieved)
{
//This means data is not recieved 

execute your asynctask else not 
}

【讨论】:

  • 你需要做很多事情才能让它工作,如果你不运行你的异步任务你不能得到你的结果,你需要先缓存数据然后按照我建议的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2018-01-03
相关资源
最近更新 更多