0

これは繰り返される質問のように思えますが、実際にはそうではありません。ソケットを介していくつかのセンサーと通信したい。接続はエミュレーターでは正常に機能しますが、Android デバイスにアップロードすると機能しません。デバッグ後、次のコードを使用してソケットを開くだけにアプリを絞り込みました。

try
{
 Socket socket = new Socket(InetAddress.getByName(ipAddress).getHostAddress(), 10001);
}
catch (Exception e)
{
 Toast.makeText(context, "Error: "+e.getMessage(), duration).show();
}

私は単にソケットを開いています。これはエミュレーターでは正常に動作しますが、デバイスでこのアプリを実行すると、しばらくの間ハングし、例外メッセージさえ表示されません...問題の可能性があるアイデア. (最初は StrictMode の問題でしたが、整理しました)。LogCat にエラーはありません。Android端末エミュレーターをインストールしてpingを試してみましたが、返信は問題ありません。前もって感謝します


これがコードです

import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener {
    Button btn;
    private CharSequence text = "";
    private Socket s;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectDiskReads()
        .detectDiskWrites()
        .detectNetwork()   // or .detectAll() for all detectable problems
        .penaltyLog()
        .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
        .detectLeakedSqlLiteObjects()
        .detectLeakedClosableObjects()
        .penaltyLog()
        .penaltyDeath()
        .build());

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(this);
    }

    public void onClick(View view){
        //detect the view that was "clicked"
        switch(view.getId())
        {
          case R.id.button1:
              new LongOperation().execute("");
          break;

        }

    }

    private class LongOperation extends AsyncTask<String, Void, String> {

          @Override
          protected String doInBackground(String... params) {

              try {
                    s = new Socket(InetAddress.getByName("o2215.airq.org").getHostAddress(), 10001);
                    text = "Connection Made";
                } catch (Exception e) {
                    text = "Error : ";
                    for(int i=0;i<e.getStackTrace().length;i++)
                    {
                        text = text +"\n"+ e.getStackTrace()[i];
                    }
                    e.printStackTrace();
                }
                return "";
          }      

          @Override
          protected void onPostExecute(String result) {
                TextView txt = (TextView) findViewById(R.id.output);
                txt.setText(text);
          }
    }
}

これはエミュレーターでは正常に機能しますが、デバイスでは機能しません。

4

1 に答える 1

0

おそらく、これはメインUIスレッドで接続を確立しようとしているためです。上記のコードスニペットをActivityクラス内に配置したようです。

ネットワークと通信するには、別のスレッドを作成する必要があります。

シンプル ThreadまたはAndroidの素晴らしいものを使用してくださいAsyncTask

于 2012-12-14T10:12:38.687 に答える