0

リストビューのAndroidアプリケーションを構築しています。サイトがオフラインかオンラインかをユーザーに伝える配列内のリストから URL がクリックされたときに、メッセージが返されるようにします。私は、ブール値を返すクイック ping によってこれを行っています。私は Java の初心者であり、onListItemClick() から if ステートメントを削除すると、アプリがクラッシュしないため、pinUrl() メソッドを呼び出す方法と関係があることを知っています。

参照用の MainActivity は次のとおりです。

package com.seven.webtools;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

@SuppressLint("UseValueOf")
public class MainActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Resources res = getResources();
    String[] Sites = res.getStringArray(R.array.Sites);
    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Sites));

}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // Get the selected url
    super.onListItemClick(l, v, position, id);
    Object o = this.getListAdapter().getItem(position);
    String address = o.toString();

    //Ping the address
    String Status = "offline";
    if (MainActivity.pingUrl(address) == true){
        Status = "online";
    }

    //Return the result
    Toast.makeText(this, address + " is " + Status, Toast.LENGTH_LONG).show();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public static boolean pingUrl(final String address) {
     try {
      final URL url = new URL("http://" + address);
      final HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
      urlConn.setConnectTimeout(1000 * 10); // mTimeout is in seconds
      final long startTime = System.currentTimeMillis();
      urlConn.connect();
      final long endTime = System.currentTimeMillis();
      if (urlConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
       System.out.println("Time (ms) : " + (endTime - startTime));
       System.out.println("Ping to "+address +" was success");
       return true;
      }
     } catch (final MalformedURLException e1) {
      e1.printStackTrace();
     } catch (final IOException e) {
      e.printStackTrace();
     }
     return false;
    }

}

あなたが私を助けることができれば、どうもありがとうございました:)

4

3 に答える 3

0

どの Android バージョンを使用していますか? UI-Main-Thread でネットワーク呼び出しを行っているため、アプリがクラッシュする可能性があります。これは、ネットワーク呼び出し中に UI がフリーズすることを意味します。古いバージョンでは、例外を取得せずに動作します。バージョン 2.3.x 以降 (間違っていたら訂正してください) android.os.NetworkOnMainThreadException、.

この問題を解決する方法の詳細については、この投稿をご覧ください。 - Android.os.NetworkOnMainThreadException を修正するには?

于 2013-05-19T20:17:55.993 に答える
0

スタック トレースを見てくださいNetworkOnMaintThreadException。メイン/UI スレッドで HTTP 接続を行っているため、エラーが発生している可能性があります。おそらくを使用して、別のスレッドでAsyncTaskそれを行うと、問題ないはずです。

于 2013-05-19T20:15:44.003 に答える