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. すべてのインターネット関連のコードをAsyncTask. そうしないと、このアプリは Android 4.0 以降のデバイスですぐにクラッシュします。
  2. 自由度の高いエラー チェックを追加します。つまり、インターネット接続に失敗した場合は、そこから読み取ろうとしません。
  3. onCreateAsyncTaskから開始し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" />

この関数を使用して、インターネット接続が利用可能かどうかを確認してください。

/**
   * 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 Not Responding) ダイアログが表示されます。代わりに、 と を使用AsyncTaskHandlerてバックグラウンド スレッドからメイン スレッドにアクセスします。

于 2012-11-28T05:38:02.710 に答える
0

最初の catch 句に return を入れるだけでよいと思います。Http Connection 例外をキャッチしたにもかかわらず、以下のコードがまだ実行されるためです。その際、"is" は null なので、"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 に答える