0

I been trying to fix this problem for a few days and still fail to fix it... Please someone can help me.

I am currently trying to develop a apps that do the same function with what starmicronic apps does. And you can find the SDK below.

http://www.starmicronics.com/support/ZipFile.aspx?sat2=195

At the start I just copy the Jar Library StarIOPort3.1.Jar into the workspace, and import to the Main.java

I tried to copy this function into my main class but at first I have missed to add the internet permission in the Manifest setting. After adding the internet permission I still get a runtime exeception of E/AndroidRuntime(776): java.lang.IllegalStateException: Could not execute method of the activity.

But it works fine with Star SDK... but not in my version.

public void PortDiscovery(View view)
{
    List<PortInfo> BTPortList;
    List<PortInfo> TCPPortList;
    final EditText editPortName;

    final ArrayList<PortInfo> arrayDiscovery;
    ArrayList<String> arrayPortName;

    arrayDiscovery = new ArrayList<PortInfo>();
    arrayPortName = new ArrayList<String>();

    try {

        BTPortList  = StarIOPort.searchPrinter("BT:");
        TCPPortList = StarIOPort.searchPrinter("TCP:");

        for (PortInfo portInfo : BTPortList) {
              arrayDiscovery.add(portInfo);
        }

        for (PortInfo portInfo : TCPPortList) {
            arrayDiscovery.add(portInfo);
        }

        arrayPortName = new ArrayList<String>();

        for(PortInfo discovery : arrayDiscovery)
        {
            String portName;

            portName = discovery.getPortName();

            if(discovery.getMacAddress().equals("") == false)
            {
                portName += "\n - " + discovery.getMacAddress();
                if(discovery.getModelName().equals("") == false)
                {
                    portName += "\n - " + discovery.getModelName();
                }
            }

            arrayPortName.add(portName);
        }


    } catch (StarIOPortException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    editPortName = new EditText(this);

    new AlertDialog.Builder(this)
    .setIcon(R.drawable.icon) 
    .setTitle("Please Select IP Address or Input Port Name") 
    .setView(editPortName) 
    .setPositiveButton("OK", new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int button)
        {
            EditText portNameField = (EditText)findViewById(R.id.editText_PortName);
            portNameField.setText(editPortName.getText());
            SharedPreferences pref = getSharedPreferences("pref", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
            Editor editor = pref.edit();
            editor.putString("portName", portNameField.getText().toString());
            editor.commit();
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int button)
        {
        }
    })
    .setItems(arrayPortName.toArray(new String[0]), new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int select)
        {
            EditText portNameField = (EditText)findViewById(R.id.editText_PortName);
            portNameField.setText(arrayDiscovery.get(select).getPortName());

            SharedPreferences pref = getSharedPreferences("pref", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
            Editor editor = pref.edit();
            editor.putString("portName", portNameField.getText().toString());
            editor.commit();
        }
    })
    .show();
}
4

1 に答える 1

0

OK スタックトレースの他の例外を見ると、NetworkOnMainThreadException が発生していることがわかります。これは、プリンターを検索するコードを開始する前に、メインの UI スレッドを終了する必要があることを意味します。スレッドを作成するか、タスクを使用できます。

この SO の質問への回答には、目的に合わせて調整できる単純なタスクの良い例があります。わかりやすくするために、PortDiscovery() メソッドを呼び出すコードはタスク内にある必要があると思います。

Android でこの例外が発生する理由は、ネットワーク操作を試行してから失敗するまでに数分かかる場合があるためです。これにより、その間 UI 全体がロックされるため、お勧めできません。

この投稿によると、この例外は Android 3.0 で導入されました。あなたが言及したStarmicronics WebサイトのAndroidプロジェクトには、デフォルトのビルドターゲット7(Android 2.1)があります。新しいサンプル Eclipse プロジェクトのビルド ターゲットがより高いか、実行構成がエミュレーターの Android のより高いバージョンで実行されている可能性があります。これは、project.properties および default.properties ファイルで確認できます。

于 2013-03-11T07:36:22.760 に答える