2017-03-13 2 views
0

Ich habe eine Listenansicht auf der Haupt-Ui, die ich über eine Asynctask aktualisieren möchte, die mit einem Mikrotik-Gerät verbindet, um Details abzurufen.Aktualisieren eines ListView auf MainActivity von Asynctask

Ich übergebe die Aktivität auch, so dass ich die Benutzeroberfläche aus einer separaten Klassendatei aktualisieren kann, aber ich bekomme immer den Fehler "Klassenname erwartet hier" für die Aktivität (mAktivität) im ListAdapter-Konstruktor. Hier

ist der AsyncTask Code:

public class MikrotikReader extends AsyncTask<String, Void, ArrayList<String>> { 

    //Default connection details for mikrotik 
    private int mkPort = 8728; 
    private int mkTimeout = 5000; 
    private String userName; 
    private String userPass; 
    private String mkIpAddress; 
    private String mkCommand; 
    private ListView listView; 
    private Activity mActivity; 

    public MikrotikReader(String user, String pass, String ipaddress, String command, Activity activity) { 
     this.userName = user; 
     this.userPass = pass; 
     this.mkIpAddress = ipaddress; 
     this.mkCommand = command; 
     this.mActivity = activity; 
    } 



    @Override 
    protected ArrayList<String> doInBackground(String... params) { 


     ArrayList<String> mylist = new ArrayList<String>(); 

     try { 
      ApiConnection con = ApiConnection.connect(SocketFactory.getDefault(), mkIpAddress, mkPort, mkTimeout); 
      con.login(userName, userPass); // log in to router 
      if (con.isConnected()) { 
       List<Map<String, String>> rs1 = con.execute(mkCommand); 
       for (Map<String, String> results1 : rs1) { 
        getResults[0] = new String(results1.get("comment")); 
        mylist.add(getResults[0]); 
       } 
       con.close(); 
      } 
     } catch (MikrotikApiException e) { 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
     return mylist; 
    } 

@Override 
    protected void onPostExecute(ArrayList<String> mylist) { 

     System.out.println("This is the array content " + mylist.get(0)); 

     listView = (ListView) mActivity.this.findViewById(R.id.listView); 
     listView.setAdapter(new ArrayAdapter<String>(mActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>())); } 

Dies ist, wie ich die AsyncTask aus der MainActivity Klassendatei aufrufen, "das", wie die Aktivität vorbei:

new MikrotikReader(user_name, password, ipaddress,"/ip/firewall/filter/print where comment=Test", this).execute(); 

Hier ist die Listenansicht in Die Datei mainactivity.xml:

<ListView 
     android:id="@+id/listView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@drawable/gradient_bg" /> 
+0

Dies ist nicht die richtige Weise, um die Listenansicht in einer anderen Aktivität zu aktualisieren.Diese asyn-Task in der anderen Klasse nicht.Sie ​​können entweder Schnittstelle oder similey setzen dies in derselben Klasse. Dann müssen Sie keine Aktivität übergeben. –

+0

Mir wurde gesagt, dass die beste Methode darin besteht, separate wiederverwendbare Klassendateien zu haben, objektorientierten Code zu pflegen und Daten zwischen ihnen zu übergeben. Da ich andere Klassendateien habe, die asynchrone Tasks zum Abrufen oder Schreiben von Daten auf das Mikrotik-Gerät verarbeiten, schlagen Sie vor, dass ich sie alle in derselben Klassendatei implementiere? Das würde zu einer klobigen Datei main_activity führen. Ist das der empfohlene Weg? – EtienneSW

Antwort

0

versuchen Sie nur mAktivity statt mActivity.this in yo ut AsyncTask Klasse

0

Tun Sie das nicht. Make-Schnittstelle wie

public interface ListPreparingListener { 
void onListPrepared(ArrayList<String> mylist); 
} 

Und es auf Ihre Haupttätigkeit implementieren wie

@Override 
onListPrepared(ArrayList<String> myList) { 
listView.setAdapter(new ArrayAdapter<String>(mActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>())); 
} 

Dann passieren diese Schnittstelle Sie Leser Konstruktor und rufen diese Methode auf Post ausführen

Upd: Eigentlich Es könnte Speicherverlust verursachen, wenn Sie einen Verweis auf Ihre Aktivität in anderen Objekten speichern. Der beste Weg ist, die Methoden subscribeListener und unsubsucribeListener zu erstellen und zu abonnieren, wenn Sie es von der Hauptaktivität benötigen, onStop abmelden. Auch auf Ihrem onPostExecute sollte überprüfen, ob es Listener gibt

Verwandte Themen