2017-12-01 13 views
0

내 Android 앱에 AsyncTask<Void, Void, Void>Scan이라는 코드를 사용하는 작업이 있습니다 : new Scan().execute();. onPreExecute() 방법에서 활동을 다시 열 때 AsyncTask의 doInBackground() 메소드가 작동하지 않습니다.

는, 그것이 DynamoDB의에서 테이블을 검색하는 doInBackground(Void... voids) 방법에 진행 대화 상자를 시작하고 onPostExecute(Void aVoid) 방법에, 그것은 진행 대화 상자를 일축하고 사용하여 ListView에있는 DB의 검사 결과를 볼 정의 BaseAdapter 클래스입니다. 내가 활동을 열 때

, 모든 위대한 실행,하지만 난 뒤로 버튼을 누르고, 다시 활동을 입력 할 때 다음에만 onPreExecute()doInBackground(Void... voids)가 실행되지 않는하면서 onPostExecute(Void aVoid) 방법이 실행되고, 그 때문에 진행 대화 상자를 보여 주거나 닫을뿐 아무 것도 화면에서 보지 못합니다.

어떻게 해결할 수 있습니까?

코드 :() 메소드 onPostExecute에 messages.notifyDataSetChanged();를 추가 할 수

MessagesListAdapter messages; 
ListView messagesLv; 
public static ArrayList<Message> arrayList; 
public static ProgressDialog progressDialog; 

public static DynamoDBScanExpression dbScanExpression; 
public static List<Message> messageList; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_messages); 

    new Scan().execute(); 
} 

private class Scan extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog = new ProgressDialog(TestActivity.this); 
     progressDialog.setTitle(name); 
     progressDialog.setMessage("Searching for messages..."); 
     progressDialog.setIndeterminate(false); 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
     dbScanExpression = new DynamoDBScanExpression(); 

     Condition condition = new Condition() 
       .withComparisonOperator(ComparisonOperator.EQ) 
       .withAttributeValueList(new AttributeValue().withS(MainActivity.msgId)); 
     dbScanExpression.addFilterCondition("msgId", condition); 

     messageList = MainActivity.mapper.scan(Message.class, dbScanExpression); 
     arrayList = new ArrayList<Message>(); 
     for (Message msg : messageList) { 
      if (msg.getUserId() == null || msg.getUserId().equals(MainActivity.userId)) { 
       msg.setMsgId(msg.getMsgId()); 
       msg.setDate(msg.getDate()); 
       msg.setTime(msg.getTime()); 
       msg.setMessage(msg.getMessage()); 
       msg.setUserId(msg.getUserId()); 
       arrayList.add(msg); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     if (!messageList.isEmpty()) { 
      messagesLv = (ListView) findViewById(R.id.messagesListView); 
      messages = new MessagesListAdapter(MinaActivity.this, arrayList); 
      messagesLv.setAdapter(messages); 

      progressDialog.dismiss(); 
     } else { 
      TextView tv = (TextView) findViewById(R.id.noMessages); 
      tv.setVisibility(View.VISIBLE); 

      progressDialog.dismiss(); 
     } 
    } 
} 
+0

코드를 게시하십시오. – ADM

+0

코드를 게시하십시오 .. – SaravInfern

+0

'public static DynamoDBScanExpression dbScanExpression;'. 그것은 doInBackground의 로컬 변수 여야합니다. 그리고 그것을 고정시키지 마십시오! – greenapps

답변

-1

시도. 코드

MessagesListAdapter messages; 
ListView messagesLv; 
public static ArrayList<Message> arrayList; 
public static ProgressDialog progressDialog; 

public static DynamoDBScanExpression dbScanExpression; 
public static List<Message> messageList; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_messages); 
    messagesLv = (ListView) findViewById(R.id.messagesListView); 
      messages = new MessagesListAdapter(MinaActivity.this, arrayList); 
      messagesLv.setAdapter(messages); 
    new Scan().execute(); 
} 

private class Scan extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog = new ProgressDialog(TestActivity.this); 
     progressDialog.setTitle(name); 
     progressDialog.setMessage("Searching for messages..."); 
     progressDialog.setIndeterminate(false); 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
     dbScanExpression = new DynamoDBScanExpression(); 

     Condition condition = new Condition() 
       .withComparisonOperator(ComparisonOperator.EQ) 
       .withAttributeValueList(new AttributeValue().withS(MainActivity.msgId)); 
     dbScanExpression.addFilterCondition("msgId", condition); 

     messageList = MainActivity.mapper.scan(Message.class, dbScanExpression); 
     arrayList = new ArrayList<Message>(); 
     for (Message msg : messageList) { 
      if (msg.getUserId() == null || msg.getUserId().equals(MainActivity.userId)) { 
       msg.setMsgId(msg.getMsgId()); 
       msg.setDate(msg.getDate()); 
       msg.setTime(msg.getTime()); 
       msg.setMessage(msg.getMessage()); 
       msg.setUserId(msg.getUserId()); 
       arrayList.add(msg); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     if (!messageList.isEmpty()) { 
      messages.notifyDataSetChanged(); 

      progressDialog.dismiss(); 
     } else { 
      TextView tv = (TextView) findViewById(R.id.noMessages); 
      tv.setVisibility(View.VISIBLE); 

      progressDialog.dismiss(); 
     } 
    } 
} 
+0

추가하려고 시도했지만, 입력 할 때 충돌이 발생합니다. 처음에는'MessagesListAdapter'에 데이터가 없기 때문에 충돌합니다. –

0

는 메시지를 찾을 수 없다는 이유 아래

또는 사용은 메시지의 사용자 ID가 등록 된 사용자의 사용자 ID에 동일한 경우 내가 선택이었다. 문제는 그것이 Intent 엑스트라에서 가져온 MainActivity.java에서 가져온 것이므로, 내가 활동을 떠날 때 변수가 지워졌습니다.

내가 한 것은 SharedPreferences에서 사용자 ID를 참조하고 갑자기 작동하는 것입니다.