[英]Updating a ListView on MainActivity from Asynctask
我在主Ui上有一個列表視圖,我希望通過Asynctask更新該列表,該Asynctask連接到Mikrotik設備以檢索詳細信息。
我也傳遞了活動,以便可以從單獨的類文件更新UI,但是在ListAdapter構造函數中,我不斷收到活動(mActivity)的錯誤“期望的類名在這里”。
這是Asynctask代碼:
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>())); }
這是我從MainActivity類文件調用Asynctask的方式,將“ this”作為活動傳遞:
new MikrotikReader(user_name, password, ipaddress,"/ip/firewall/filter/print where comment=Test", this).execute();
這是mainactivity.xml文件中的列表視圖:
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient_bg" />
嘗試在您的AsyncTask類中僅使用mActivity而不是mActivity.this
不要這樣 使界面像
public interface ListPreparingListener {
void onListPrepared(ArrayList<String> mylist);
}
並在您的主要活動上實施
@Override
onListPrepared(ArrayList<String> myList) {
listView.setAdapter(new ArrayAdapter<String>(mActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>()));
}
然后,將此接口傳遞給讀者的構造函數,並在執行后調用此方法
Upd:實際上,如果將對活動的引用存儲在其他對象中,則可能會導致內存泄漏。 最合適的方法是使方法subscribeListener
和unsubsucribeListener
並在需要時從主要活動中進行訂閱,即取消訂閱onStop
。 另外在onPostExecute上應該檢查是否有可用的偵聽器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.