2014-05-20 1 views
0

Je reçois une android.os.NetworkOnMainThreadException lorsque j'exécute ce code que le pot est fourni par la fabrication de l'imprimante. L'erreur vient directement à StarIOPort.searchPrinter. Je ne reçois pas l'erreur exécutant le code de démo fourni par la fabrication.Rechercher une imprimante réseau NetworkOnMainThreadException

J'essaie de voir s'il y a des imprimantes réseau disponibles sur le réseau local.

private void PortDiscovery(String interfaceName) 
{ 
final EditText editPortName; 
ArrayList<String> arrayPortName;  
List<PortInfo> BTPortList; 
List<PortInfo> TCPPortList; 
final ArrayList<PortInfo> arrayDiscovery; 

try { 
    if (true == interfaceName.equals("BT")) { 
     BTPortList = StarIOPort.searchPrinter("BT:"); 

     for (PortInfo portInfo : BTPortList) { 
       arrayDiscovery.add(portInfo); 
     } 
    } 
    if (true == interfaceName.equals("LAN")) { 
     TCPPortList = StarIOPort.searchPrinter("TCP:"); 

     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) { 
     e.printStackTrace(); 
} 

editPortName = new EditText(this); 

new AlertDialog.Builder(this).setTitle("Please Input Port Name").setView(editPortName).setPositiveButton("OK", new DialogInterface.OnClickListener(){ 
    public void onClick(DialogInterface dialog, int button){ 
    EditText portNameField = (EditText)findViewById(R.id.printerName); 
     portNameField.setText(editPortName.getText()); 
} 
}) 
.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.printerName);portNameField.setText(arrayDiscovery.get(select).getPortName()); 

    } 
    }) 
.show(); 


} 

Répondre

1

Vous obtenez le NetworkOnMainThreadException parce que le système d'exploitation Android ne permet pas de processus lourds (comme les opérations liées au réseau) pour exécuter sur le thread principal (également appelé l'interface utilisateur fil parfois) parce que ces opérations/processus peut prendre beaucoup de ressources et de temps pour fonctionner, et par conséquent, l'application peut être retardée. Une solution consiste à mettre votre processus dans un thread exécutable et instancier ce thread dans votre onCreate() ou où vous en avez besoin, par exemple, sur un onClickListener();. Do est comme ceci:

private class Print extends AsyncTask<String, Void, String> { 
    ProgressDialog pDialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Log.d("Hi", "Print Commencing"); 

     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setMessage("Printing..."); 


     String message= "Printing"; 

     SpannableString ss2 = new SpannableString(message); 
     ss2.setSpan(new RelativeSizeSpan(2f), 0, ss2.length(), 0); 
     ss2.setSpan(new ForegroundColorSpan(Color.BLACK), 0, ss2.length(), 0); 

     pDialog.setMessage(ss2); 

     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     Log.d("Hi", "Printing"); 
     //Toast.makeText(getApplicationContext(), "Printing.", Toast.LENGTH_LONG).show(); 

     //insert your code here 

     return "Executed!"; 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     //Toast.makeText(getApplicationContext(), "Done printing.", Toast.LENGTH_LONG).show(); 
     Log.d("Hi", "Done Printing."); 
     pDialog.dismiss(); 

    } 
} 

et appellent d'une fonction comme ceci:

new Print().execute("") 

Dans le onPreExecute(), j'Initialiser une ProgressDialog qui n'est pas résiliable pour garantir que votre processus se termine correctement. Vous devez insérer votre code dans la partie doInBackground();.

+0

Je vois comment je peux mettre la recherche de l'imprimante dans le doInBackground, mais je ne vois pas comment je peux récupérer le arraylist arrayDiscovery afin que l'utilisateur puisse sélectionner l'imprimante à utiliser? –

Questions connexes