当没有互联网连接时,我的活动会被强制关闭。如何阻止这种情况?我正在考虑向用户显示一条消息,如果没有连接,就没有互联网连接。我应该在哪些方面更改代码?提前致谢
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;
}}}
答案 0 :(得分:1)
AsyncTask
。如果你不这样做,这个应用程序将立即在任何Android 4.0+设备上崩溃。AsyncTask
,然后在onPostExecute
中使用获取结果更新您的UI,或者在失败时显示消息。答案 1 :(得分: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网络不包含Internet访问权限或需要基于浏览器的身份验证,则仍然可以连接。
you will need this permission in your manifest: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
只需使用此功能检查互联网连接是否可用:
/**
* 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;
}
答案 2 :(得分: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
和Handler
从后台线程访问主线程
答案 3 :(得分:0)
我认为你可以在第一个catch子句中放回一个。因为尽管你已经发现了Http Connection异常,但仍然会执行下面的代码。那时,“是”为空,所以从“是”读取会导致崩溃。
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!!!!!!!!!!!!
}