2017-03-13 2 views
0

주 Ui에서 목록보기를 사용하여 세부 사항을 검색하기 위해 Mikrotik 장치에 연결하는 Asynctask를 통해 업데이트하고 싶습니다.MainActivity에서 Asynctask에서 ListView 업데이트하기

ListAdapter 생성자의 활동 (mActivity)에 대해 "Class name expected here"오류가 계속 발생하지만 별도의 클래스 파일에서 UI를 업데이트 할 수 있도록 활동을 전달 중입니다. 여기

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

가있는 목록보기이다 : 나는 MainActivity 클래스 파일에서 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>())); } 

이 "이"활동으로 전달입니다 : 여기

은 AsyncTask를 코드입니다 mainactivity.xml 파일 :

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

다른 활동에서 목록보기를 업데이트하는 방법이 올바르지 않습니다.이 asyn 작업을 다른 클래스에 넣으십시오. 인터페이스를 사용하거나 간단하게 같은 것을 넣을 수 있습니다. 그렇다면 당신은 활동을 통과 할 필요가 없습니다. –

+0

나는 최상의 실천이 별도의 재사용 가능한 클래스 파일을 가지고, 객체 지향 코드를 유지하고, 그들 사이에 데이터를 전달하는 것이라고 들었다. Mikrotik 장치에 데이터를 가져 오거나 쓰는 비동기 작업을 처리하는 다른 클래스 파일이 있으므로 동일한 클래스 파일을 모두 구현하도록 제안 하시겠습니까? 이렇게하면 chunky main_activity 파일이 생성됩니다. 그게 좋을가? – EtienneSW

답변

0

대신에 mActivity 만 사용하십시오. ut AsyncTask 클래스

0

이렇게하지 마십시오.

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

같은 만들기 인터페이스와

UPD를, 그리고

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

처럼 주요 활동에 그것을 구현하는 당신에게 독자의 생성자를이 인터페이스를 통과 게시물에이 방법이

을 실행 전화 : 를 실제로 다른 객체 안에 액티비티에 대한 참조를 저장하면 메모리 누수가 발생할 수 있습니다. 가장 적절한 방법은 방법 subscribeListenerunsubsucribeListener을 만들고 주 활동에서 필요할 때 구독하는 것입니다. 수신 거부 onStop을 구독하십시오. onPostExecute 또한 사용할 수있는 수신기가 있는지 확인해야합니다

관련 문제