从Android中的第一个AsyncTask调用第二个活动

时间:2013-07-06 19:40:13

标签: android android-intent android-activity android-asynctask show

我有2个布局:MainActivity.xml,MenuActivity.xml。 我想从1-st的AsyncTask加载MenuActivity。 这是更新的代码:

class InternetCheck extends AsyncTask<Activity, Void, Boolean> {
    public Activity act=new Activity();


    protected Boolean doInBackground(Activity... activities) {

        boolean status=false;

        act=activities[0];
        String rurl=act.getString(R.string.url_test);


        try 

        {

        URL url = new URL(rurl);

            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1000 * 20); // mTimeout is in seconds
                    urlc.connect();
            if (urlc.getResponseCode() == 200) {
                status=true;
            }

        }
            catch (MalformedURLException e1) {
                status=false;
            } 

            catch (IOException e) {
                status=false; 
            }

        return status;

    }


    protected void onPostExecute(Boolean result) {


        if (result==false) {
            MainActivity mActivity = (MainActivity) act;
            mActivity.ShowNoConnectionButton();
        }
        else
        {
            Intent intent = new Intent(act, MenuActivity.class);
            act.startActivity(intent);
            //setContentView(R.layout.menu_activity);

        };


    }


}

如果结果为false,我们会显示来自UI类的按钮,如果是,则必须加载第二个活动。对于startActivity(intent),我得到错误:类型为InternetCheck的方法未定义。 也可以使用Intent参数并从AsyncTask调用UI方法ShowNoConnectionButton吗?很难理解我们必须在Intent参数中添加什么以及如何获取这些参数。

但它会错误地发布APP。

第二个屏幕类:

public class MenuActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu_activity);

    }


}

1 个答案:

答案 0 :(得分:0)

在AsyncTask类的构造函数中,您应该接受上下文(启动异步任务的活动的实例)作为参数并将其保存在成员变量中,稍后在onPostExecute中将其用作context.startActivity()。

这意味着你应该为AsyncTask定义一个构造函数,而不是使用默认的无参数构造函数。

更新:看到完整的代码后,我建议如下:

您不应该自己构建活动。

class InternetCheck extends AsyncTask<Activity, Void, Boolean> {

    private MainActivity act;

    public InternetCheck(Activity activity) {
        this.act = (MainActivity)activity;
    }
...


protected void onPostExecute(Boolean result) {


        if (result==false) {
            act.ShowNoConnectionButton();
        }
        else
        {
            Intent intent = new Intent(act, MenuActivity.class);
            act.startActivity(intent);
        };

    }
...
}