2

当没有互联网连接时,我的活动会被强制关闭。如何防止这种情况?我正在考虑向用户显示一条消息,如果没有连接,则没有互联网连接。我应该通过哪些方式更改代码?提前致谢

public class Myclass extends BaseActivity {

private String[] imageUrls;

private DisplayImageOptions options;

private InputStream is;

private String result;

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.ac_image_grid);


    imageUrls = new String[1000];

    try{

        HttpClient httpclient = new DefaultHttpClient();

        HttpPost httppost = new HttpPost(D.url+"gal.php");

        List nameValuepairss = new ArrayList(1);
        // adding attributes to List 
        nameValuepairss.add(new BasicNameValuePair("type","gal_living"));

       httppost.setEntity(new UrlEncodedFormEntity(nameValuepairss));
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        Log.e("log_tag", "connection success username");

}catch(Exception e){
        Log.e("log_tag", "Error in http connection "+e.toString());
        Toast.makeText(getApplicationContext(), "fail1", Toast.LENGTH_SHORT).show();

}
//convert response to string
try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");

        }
        is.close();

        result=sb.toString();
}catch(Exception e){

       Log.e("log_tag", "Error converting result :::"+e.toString());
   // Toast.makeText(getApplicationContext(), "fail1", Toast.LENGTH_SHORT).show();

}
try{


    JSONArray jArray = new JSONArray(result);
    int arrayLength=jArray.length();
    final String url[]=new String[arrayLength];

    for(int i=0;i<arrayLength;i++){
           JSONObject json_data = jArray.getJSONObject(i);



          url[i]=json_data.getString("url");
    }
    List<String> urls = new ArrayList<String>();
    urls.addAll(Arrays.asList(url));
    imageUrls = urls.toArray(new String[0]);

} catch(JSONException e){
    Log.e("log_tag", "Error parsing data:::::again? "+e.toString());
    }   options = new DisplayImageOptions.Builder()
        .showStubImage(R.drawable.stub_image)
        .showImageForEmptyUri(R.drawable.image_for_empty_url)
        .cacheInMemory()
        .cacheOnDisc()
        .build();
    GridView gridView = (GridView) findViewById(R.id.gridview);
    gridView.setAdapter(new ImageAdapter());
    gridView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            startImageGalleryActivity(position);
        }
    });
}

private void startImageGalleryActivity(int position) {
    Intent intent = new Intent(this, ImagePagerActivity.class);
    intent.putExtra(Extra.IMAGES, imageUrls);
    intent.putExtra(Extra.IMAGE_POSITION, position);
    startActivity(intent);
}

public class ImageAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        return imageUrls.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ImageView imageView;
        if (convertView == null) {
            imageView = (ImageView) getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
        } else {
            imageView = (ImageView) convertView;
        }

        imageLoader.displayImage(imageUrls[position], imageView, options, new SimpleImageLoadingListener() {
            @Override
            public void onLoadingComplete(Bitmap loadedImage) {
                Animation anim = AnimationUtils.loadAnimation(LivingGrid.this, R.anim.fade_in);
                imageView.setAnimation(anim);
                anim.start();
            }
        });

        return imageView;
    }}}
4

4 回答 4

1
  1. 将所有与 Internet 相关的代码移动到AsyncTask. 如果您不这样做,此应用程序将在任何 Android 4.0+ 设备上立即崩溃。
  2. 添加自由错误检查——即如果互联网连接失败,不要尝试从中读取。
  3. 从onCreate 开始AsyncTask,并onPostExecute使用获取的结果更新您的 UI,或者在失败时显示一条消息。
于 2012-11-28T05:36:03.110 回答
1

试试这个。

这将告诉您是否已连接到网络:

boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
        //we are connected to a network
        connected = true;
    }
    else
        connected = false;

警告:如果您连接到不包括互联网访问或需要基于浏览器的身份验证的 WiFi 网络,则已连接仍为 true。

you will need this permission in your manifest: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

只需使用此功能检查 Internet 连接是否可用:

/**
   * Checks if the device has Internet connection.
   * 
   * @return <code>true</code> if the phone is connected to the Internet.
   */
    public static boolean checkNetworkConnection(Context context)
    {
        final ConnectivityManager connMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        final android.net.NetworkInfo wifi =connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        final android.net.NetworkInfo mobile =connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        if(wifi.isAvailable()||mobile.isAvailable())
            return true;
        else
            return false;
    }
于 2012-11-28T05:37:04.857 回答
1

采用ConnectivityManager

ConnectivityManager connection =  Context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo currentConnection = connection.getActiveNetworkInfo();


if(currentConnection != null && currentConnection.isConnected())
{
  // You have a network connection
}
else
{
   // No Network connection
}

不要忘记

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

额外的:

您不应该在主线程中执行任何网络操作,否则您将获得 ANR(Android 无响应)对话框。相反,使用AsyncTask andHandler从后台线程访问主线程

于 2012-11-28T05:38:02.710 回答
0

我认为您可以在第一个 catch 子句中添加一个 return。因为虽然你已经捕获了 Http Connection 异常,但是下面的代码仍然会被执行。那时,“is”为空,所以从“is”读取会导致崩溃。

try{

    HttpClient httpclient = new DefaultHttpClient();

    HttpPost httppost = new HttpPost(D.url+"gal.php");

    List nameValuepairss = new ArrayList(1);
    // adding attributes to List 
    nameValuepairss.add(new BasicNameValuePair("type","gal_living"));

   httppost.setEntity(new UrlEncodedFormEntity(nameValuepairss));
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    Log.e("log_tag", "connection success username");

}catch(Exception e){
    Log.e("log_tag", "Error in http connection "+e.toString());
    Toast.makeText(getApplicationContext(), "fail1", Toast.LENGTH_SHORT).show();

    return; // ADD return HERE!!!!!!!!!!!!
}
于 2012-11-28T05:38:15.690 回答