0

MainActivity.xml、MenuActivity.xml の 2 つのレイアウトがあります。1stの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 クラスからボタンを表示します。true の場合、2 番目のアクティビティをロードする必要があります。startActivity(intent) の場合、エラーが発生します: InternetCheck 型のメソッドが未定義です。また、Intent パラメータと AsyncTask から UI メソッド ShowNoConnectionButton を呼び出しても問題ありませんか? Intent パラメーターに何を入れなければならないか、およびこれらを取得する方法を理解するのはかなり困難です。

しかし、それはエラーでアプリを停止します.

2 番目の画面クラス:

public class MenuActivity extends Activity {

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

    }


}
4

1 に答える 1

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);
        };

    }
...
}
于 2013-07-06T19:46:57.820 に答える