如何在执行asynctask之前检查服务状态?

时间:2015-05-10 10:39:37

标签: android android-asynctask

我想根据webservice的状态执行asynctask ....如果web服务关闭,那么将显示toast ...但它并不像我想要的那样工作......

ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo nIn = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            State s = nIn.getState();

            ServiceCheck sc = new ServiceCheck(MainActivity.this);

            if(s == NetworkInfo.State.CONNECTED)
            { 
                if(sc.isServiceOk())
                {
                   new Test().execute(file_url);
                }
            }

这就是我要检查服务状态的地方......

public class ServiceCheck {
private Context cntext;
    public ServiceCheck(Context context)
    {
        this.cntext = context;
    }

    public boolean isServiceOk()
    {   
        try
        {  
            ConnectivityManager conMan = (ConnectivityManager) cntext.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo nInf = conMan.getActiveNetworkInfo();

            if(nInf != null && nInf.isConnected())
            {
            URL url = new URL(file_url);
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(10000);
            urlc.connect();

            if(urlc.getResponseCode() == 200)
            {
                return true;
            }
            else
            {
                Toast.makeText(cntext, "Service Down", Toast.LENGTH_LONG).show();
                //return false;
            }
        }
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }

        return false;
    }

1 个答案:

答案 0 :(得分:1)

您必须在后台线程中执行isServiceOk()方法。根据您发布的内容,您似乎正在从主线程进行此网络调用,这将引发异常。您必须将此方法的结果发回主线程,然后确定是否要继续。如果将此方法委派给后台线程,您仍然可以使用Handler发布Toast。

再次,根据您发布的内容推断,Test是AsyncTask的实现。那部分很好,因为我保证你的网络操作是在后台进行的。

底线是,无论如何,你的isServiceOk()方法需要从后台线程运行 - AsyncTask或普通线程都可以。