0

デバイスのネットワーク帯域幅を確認するためのこの基本的な方法を作成しているときに、logcat スタックトレース (私は Android にあまり詳しくありません) に本当に困惑しています。このコードは Web ページを読み込み、所要時間を計測し、ダウンロードされたコンテンツを測定します。次に、この値を Web ページの読み込みにかかったミリ秒で割り、おおよその帯域幅を計算します。

コード:

public class MainActivity extends Activity {
private int linkSpeed;
private TextView textView;

/** Called when the activity is created. */

@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);
    textView = new TextView(this);
    textView.setTextSize(25);

  //Download your image
    Thread thread = new Thread(new Runnable() {
        public void run() {
            try {
                String urlString = "http://www.google.com";
                long startTime = System.currentTimeMillis();
                HttpGet httpRequest = new HttpGet(new URL(urlString).toURI());
                HttpClient httpClient = new DefaultHttpClient();
                HttpResponse response = (HttpResponse) httpClient.execute(httpRequest);
                long endTime = System.currentTimeMillis();

                HttpEntity entity = response.getEntity();
                BufferedHttpEntity bufHttpEntity;
                bufHttpEntity = new BufferedHttpEntity(entity);

                //You can re-check the size of your file
                final long contentLength = bufHttpEntity.getContentLength();

                // Log
                String TAG = "tag";
                Log.d(TAG, "[BENCHMARK] Dowload time :"+(endTime-startTime)+" ms");

                // Bandwidth : size(KB)/time(s)
                float bandwidth = contentLength / ((endTime-startTime) *1000);

                textView.setText("bandwidth = " + bandwidth);
                setContentView(textView);
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    thread.start();
}

このクラスでハンドラーを使用したことがないため、ハンドラーを作成できないと文句を言う LOGCAT について混乱しています。ログキャット トレース:

07-03 14:42:18.214: D/dalvikvm(2401): Late-enabling CheckJNI
07-03 14:42:18.474: D/tag(2401): [BENCHMARK] Dowload time :166 ms
07-03 14:42:18.474: W/dalvikvm(2401): threadid=11: thread exiting with uncaught exception (group=0x4162e930)
07-03 14:42:18.474: E/AndroidRuntime(2401): FATAL EXCEPTION: Thread-201
07-03 14:42:18.474: E/AndroidRuntime(2401): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
07-03 14:42:18.474: E/AndroidRuntime(2401):     at android.os.Handler.<init>(Handler.java:197)
07-03 14:42:18.474: E/AndroidRuntime(2401):     at android.os.Handler.<init>(Handler.java:111)
07-03 14:42:18.474: E/AndroidRuntime(2401):     at com.android.internal.app.ActionBarImpl.<init>(ActionBarImpl.java:108)
07-03 14:42:18.474: E/AndroidRuntime(2401):     at android.app.Activity.initActionBar(Activity.java:1867)
07-03 14:42:18.474: E/AndroidRuntime(2401):     at android.app.Activity.setContentView(Activity.java:1902)
07-03 14:42:18.474: E/AndroidRuntime(2401):     at com.example.networkinfo.MainActivity$1.run(MainActivity.java:69)
07-03 14:42:18.474: E/AndroidRuntime(2401):     at java.lang.Thread.run(Thread.java:856)
07-03 14:42:18.524: D/dalvikvm(2401): GC_CONCURRENT freed 232K, 5% free 7525K/7912K, paused 9ms+2ms, total 50ms
07-03 14:42:18.894: D/libEGL(2401): loaded /system/lib/egl/libEGL_tegra.so
07-03 14:42:18.914: D/libEGL(2401): loaded /system/lib/egl/libGLESv1_CM_tegra.so
07-03 14:42:18.924: D/libEGL(2401): loaded /system/lib/egl/libGLESv2_tegra.so
07-03 14:42:18.944: D/OpenGLRenderer(2401): Enabling debug mode 0
4

3 に答える 3

0

非 UI スレッドから setContentView を呼び出すことはできません。私の提案は、そのスレッドを AsyncTask に変換し、コンテンツ ビューを onPostExecute に設定することです。setText 呼び出しにも同じ問題があります。

于 2013-07-03T19:53:31.910 に答える
0

この行

textView.setText("bandwidth = " + bandwidth);

ご迷惑をおかけしています。UIバックグラウンドでを更新しようとしていますThread。それを にして、 以外の方法でAsyncTaskを更新するか、使用する必要がありますUIdoInBackground()runOnUiThread()

runOnUiThread() の使用例を次に示します。

および AsyncTask の 1 つ

AsyncTask ドキュメント

于 2013-07-03T19:53:34.910 に答える