2017-10-22 1 views
-3

현재 내 대학에서 프로젝트 용 앱을 개발 중입니다. 이 프로젝트는 내가 구축 한 웹 서비스에 대한 동기식 및 비동기식 http 요청을 처리 할 수있는 benig로 구성됩니다. 나는 HTTP 요청을 보낼 수있는 클래스 나 코드를 만들어야한다. (쉽게 AsyncTask를 끝내기가 쉽다) 콜백은 액티비티로 되돌아 간다.asynctask에서 다시 활동으로 콜백

onPostExecute() 메서드는 아무 것도 반환하지 않는 void 메서드이므로 공용 변수에 응답 내용을 저장할 수 없기 때문에이 방법을 알지 못합니다. 다른 클래스. 내가 원하는 무엇

은 다음 활동에서

:

MessageCentre centre = new MessageCentre(); 
centre.getMessages(1); 

1가 이드 내 애플 리케이션 서버에 로그인이 장치에 기인한다. 그런 다음 서버는이 ID와 연관된 모든 메시지를 JSONArray 형식으로 검색합니다. 내가 작성한 Message 클래스에 JSONObject를 캐스팅하고 MessageCentre 클래스 인스턴스 안에 정적 배열로 모든 새 객체를 저장합니다.

여기에서 메시지를 사용자에게 표시해야하지만 getMessages (1) 메소드 내부에서 내 애플리케이션에서 보조 스레드를 생성하는 AsyncTask를 실행하기 때문에이를 수행 할 수 없습니다. 다음과 같이하지만, 그래서 코드는 계속된다 (그는 어댑터를 렌더링하기 때문에 메시지가 응용 프로그램 서버에서 도착하기 전에)

ArrayAdapter a = new ArrayAdapter(getApplicationContext(),R.id.item_layout, centre.getMessagesList()); 
listview.setAdapter(a); 

내가도 설정하지 않으려는 메시지를 표시하지 않는 ArrayAdapter와 AsyncTask에서 어댑터를 가져오고 싶습니다. 사용자가 간단히 메서드를 호출하고 일반 객체 배열을 수신하여 "작동하게"할 수있는 "블랙 박스 (black-box)"형식으로 만들고 싶습니다.

또한 응용 프로그램을 충돌시키고 ANR 오류를 표시하기 때문에 Thread.sleep()을 수행하여 몇 초 동안 기다리는 작업을 알 수 없습니다.

그래서 난이 처리 생각할 수있는 몇 가지 방법이 있습니다

1) ANR

2) 어떻게든지 활동이 밤은 다시 데이터를 반환하지 않고 얼마 동안 활동 대기를 만드는 방법 어떤 종류의 콜백 메소드에서 onPostExecute() 메쏘드

3) 런타임에 어댑터와리스트 뷰가 itens (OnCreateView() 메소드)를 업데이트하고 생성하여 메시지를 보여줄 수있게 만든다. 메시지가 실제로 도착하면 몇 초 후에 앱 서버에서 설정되고 렌더링됩니다.

숫자 3이 더 가능성이 높다고 생각하며, 채팅 응용 프로그램이하는 것과 더 비슷합니다. 난 단지 런타임에 메시지 목록을 업데이트하는 방법을 모르겠다.

도움이 되셨다면 감사드립니다.

답변

2

interface을 만들어 콜백 할 수 있습니다.

예 :

클래스 AsyncTaskMessage 만들 :

public class AsyncTaskMessage extends AsyncTask<Void, Void, Void> { 


    Context context; 
    public OnMessageListener mListener; 

    public interface OnMessageListener { 
     void messageCallback(ArrayList<String> messageList); // you can change the parameter here. depends on what you want. 
    } 

    public AsyncTaskMessage(Context context) { 
     this.context = context; 
     mListener = (OnMessageListener) context; 
    } 

    @Override 
    public void onPreExecute() { 

    } 

    @Override 
    protected void onPostExecute() { 
     // your code goes here for the callback. 
     // messageList - A list of messages. 
     mListener.messageCallback(messageList); 
    } 
} 

을 다음 MessageCentre 클래스 :

다음
public class MessageCentre { 

    Context context; 
    public void MessageCentre(Context context) { 
     this.context = context; 
    } 

    public void getMessages(int id) { 
     // You said your asyncTask goes here. 
     AsyncTaskMessage async = new AsyncTaskMessage(context); 
     async.execute(); 
    } 
} 

활동 곳 ArrayAdapter

// A class where your ArrrayAdapter. 
public class MainActivity extends AppCompatActivity implements AsyncTaskMessage.OnMessageListener { 

    //.. 

    public void displayMessage() { 
     MessageCentre centre = new MessageCentre(this); 
     centre.getMessages(1); 
    } 

    @Override 
    public void messageCallback(ArrayList<String> messageList) { 
     Log.i("MainActivity", "Response: " + messageList.toString()); 
     ArrayAdapter a = new ArrayAdapter(getApplicationContext(),R.id.item_layout, messageList); 
     listview.setAdapter(a); 
    } 
} 
+0

"messageList"변수의 출처가 어디인지 이해하지 못했습니다. AsyncTaskMessage 클래스 안에이 변수가 없습니다. AsyncTaskMessage 클래스를 인스턴스화 할 때 MessageCentre 클래스에서 매개 변수로 전달합니까? –

+0

또한, 줄에서 캐스팅 오류가 나타납니다. mListener = (OnMessageListener) context; AsyncTaskMessage 생성자 내부 –

+0

'messageList'는'centre.getMessagesList()' – Jerrol

관련 문제