2011-03-14 102 views
1

我开发了一个android 2.1应用程序,它使用SOAP Web服务。 当我的应用程序开始使用时,它首先检查是否有互联网连接。重新启动应用程序再次从主要和清除活动堆栈

如果是这样,它将显示相应的活动。 如果没有,那么它将显示一个活动(NetworkErrorActivity),提供关于网络错误和所有信息。

问题是如果没有互联网连接,它会向我显示NetworkErrorActivity。 现在,当用户按下后退按钮时,它将用户重定向到Home。 我已经重写onBackPressed方法是这样的:

@覆盖 公共无效onBackPressed(){

 Intent setIntent = new Intent(Intent.ACTION_MAIN); 
     setIntent.addCategory(Intent.CATEGORY_HOME); 
     setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(setIntent); 
     return; 
    } 

按后退按钮后,它让我看到的是Android主屏幕。 但问题是,当我再次启动相同的应用程序时,即使有网络连接,它也会向我显示NetworkErrorActivity。无法从主启动器活动启动应用程序。它总是向我展示同一活动一次又一次。

+0

显示在您检查网络并启动该活动的代码 – ingsaurabh

+0

看到这个: 尝试{\t \t androidHttpTransport =新HttpTransportSE(URL,30000); \t \t androidHttpTransport.call(SOAP_ACTION,envelope); \t \t so =(SoapObject)envelope.bodyIn; \t \t String st = so.toString(); //做一些处理..... } 赶上(例外五) \t \t { \t \t Log.i( “没有互联网”,e.getMessage()); \t \t this.cancel(true); \t \t Intent intent = new Intent(context,NetworkErrorActivity.class); \t \t startActivity(intent); \t \t \t \t} –

+0

是每一个日志打印的时间,如果是,那么有一些例外,这并不是网络,而是使捕捞代码每次运行时使调试代码的任何异常 – ingsaurabh

回答

1

我使用AlertDialog(不是活动)通知用户需要网络连接并带有一个选项,以将其连接到网络设置(启用移动/ wi-fi)连接。如果他们选择单击“取消”,而是强制完成主要活动()。

检查主活动onResume()中的网络连接,并且如果没有连接,则调用CreateNetErrorDialog()...不可能使用BACK来关闭对话框 - 仅取消杀死主要活动的对话框。

例...

protected void CreateNetErrorDialog(String errorMessage) { 
    Log.d(TAG, "CreateNetErrorDialog() entered..."); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage(errorMessage) 
    .setTitle("Unable to connect") 
    .setCancelable(false) 
    .setPositiveButton("Settings", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Intent i = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 
       startActivity(i); 
      } 
     } 
    ) 
    .setNegativeButton("Cancel", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       MyMainActivity.this.finish(); 
      } 
     } 
    ); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
    Log.d(TAG, "Exiting CreateNetErrorDialog()..."); 
} 

编辑:调用CreateNetErrorDialog从您的AsyncTask的onPostExecute()方法 - 它运行在UI线程(doInBackground没有)。从我自己的代码示例...

private class FileDownloader extends AsyncTask<String, Void, Void> { 
    private Boolean Success = false; 
    private String ResultString = ""; 

    @Override 
    protected Void doInBackground(String... params) { 
     try { 
      // Do whatever 
     } 
     catch (Exception e) { // <-- Use the correct exception type 
       ResultString = "Some error message"; 
     } 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (!Success) 
      CreateNetErrorDialog (ResultString); 
     else 
      // Do whatever 
    } 
} 
+0

我想要做的是,当没有互联网连接,我想显示的东西告诉用户,你没有互联网连接或网络错误...然后要强制应用程序关机 你可以建议我什么将是最好的做这件事? –

+1

@Kartik:我试图展示的不是启动一个Activity来告诉用户存在网络问题,而是尝试一个AlertDialog,就像我在代码中显示的那样(将消息更改为任何你需要的内容)。如果需要,“设置”按钮可让他们选择转到Android设置以启用Wi-Fi /移动互联网 - 当他们从设置返回时,如果连接再次失败,请再次显示对话框。如果他们在AlertDialog上使用Cancel,它将在您的主要活动中调用finish(),并且不可能使用BACK退出AlertDialog,因此可以解决您的问题。 – Squonk

+0

@ MisterSquonk:你是绝对正确的。看看我在做什么,当我的应用程序启动时,它会检查互联网连接。我已经使用AsynTask进行后台处理。我正在使用网络超时参数? (我不知道它是否好)。如果发生网络超时,则会引发InterruptedException。在catch块中,我正在调用alertdialog。但它没有向我展示对话。 –

0

我完全不知道你想要什么,但在catch block尝试这样的事情,而不是做一个连接,并编写代码的这是不是一个好的做法

到检查网络使用以下代码

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo ni = cm.getActiveNetworkInfo(); 

然后根据不同的上述代码结果

if (ni == null) 
{ 
     //Show you network error activity 
} 
else 
{ 
    //Show some other activity 
} 
+0

我也试过这个。但它总是让我联系起来。 :( 我认为问题是:我连接到局域网但没有登录因特网使用在防火墙。我需要改变我的IP我想或使用个人电脑?? –

+0

可能会尝试在真实设备上.. – ingsaurabh

+0

Yaa是正确的,让我试试这个。请检查它并发表评论。 –