2017-03-13 2 views
0

私はメインのUiのリストビューを持っていて、詳細を取得するためにMikrotikデバイスに接続するAsynctaskを通して更新したいと考えています。MainActivityのListViewをAsynctaskから更新する

私は別のクラスファイルから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を呼び出す方法です:

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" /> 
+0

がある場合、これは別のactivity.Dontでリストビューを更新するための正しい方法ではありませんチェックする必要があるインターフェイスを使用するか、または同じでこれを入れsimpley異なるclass.YouでこのASYNタスクを置きますアクティビティを渡す必要はありません。 –

+0

私は、ベストプラクティスは、独立した再利用可能なクラスファイルを持つように、オブジェクト指向のコードを維持するために、それらの間でデータを渡していると言われました。 私はMikrotikデバイスにデータを取得したり、書き込むための非同期タスクを処理する他のクラスファイルを持っているので、あなたは私がそれら全てのi同じクラスファイルを実装勧めますか? これは、chunky main_activityファイルになります。それはお勧めの方法ですか? – EtienneSW

答えて

0

代わりにmActivityを使用するようにしてください。これはyoですut AsyncTaskクラス

0

このようにしないでください。

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実行します。実際に をあなたのアクティビティへの参照を他のオブジェクトの中に格納すると、メモリリークが発生する可能性があります。最も適切な方法は、方法subscribeListenerunsubsucribeListenerを作成し、メインアクティビティから必要なときにサブスクライブすることです。onStopを登録解除してください。また、あなたのonPostExecuteに使用可能なリスナー

関連する問題