2012-11-08 4 views
0

아래 코드에서는 인터넷에서 json을 다운로드하고 목록에 표시하려고합니다. 목록이 비어 있으면 다른 활동으로 이동하지만 다른 활동은 시작되지 않습니다. 오류는 발생하지만 시작 활동이 없습니다. 당신의 도움에 대한 감사doInBackground 메서드에서 작업 시작

package ir.mohammadi.android.nightly; 

import java.util.ArrayList; 
import java.util.HashMap; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.Toast; 

public class AllNotes extends ListActivity { 

    ProgressDialog pDialog; 

    ArrayList<HashMap<String, String>> noteList; 

    JSONArray notes = null; 

    private static String KEY_SUCCESS = "success"; 
    private static String KEY_ERROR_MSG = "error_message"; 
    private static String KEY_NOTE_ID = "note_id"; 
    private static String KEY_NOTE_SUBJECT = "note_subject"; 
    private static String KEY_NOTE_DATE = "note_date"; 

    private static String EXECUTE_RESULT = null; 

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

     noteList = new ArrayList<HashMap<String, String>>(); 
     new LoadAllNotes().execute(); 
     ListView lv = getListView(); 
    } 

    public class LoadAllNotes extends AsyncTask<String, String, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(AllNotes.this); 
      pDialog.setMessage("لطفا صبر کنید..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     protected String doInBackground(String... args) { 

      UserFunctions userFunctions = new UserFunctions(); 

      JSONObject jSon = userFunctions.getAllNotes("1"); 

      Log.i("AllNotes >> jSon >>", jSon.toString()); 
      try { 
       String success = jSon.getString(KEY_SUCCESS); 
       if (success == "1") { 
        notes = jSon.getJSONArray("notes"); 

        for (int i = 0; i < notes.length(); i++) { 
         JSONObject c = notes.getJSONObject(i); 

         String id = c.getString(KEY_NOTE_ID); 
         String subject = c.getString(KEY_NOTE_SUBJECT); 
         String date = c.getString(KEY_NOTE_DATE); 

         HashMap<String, String> map = new HashMap<String, String>(); 
         map.put(KEY_NOTE_ID, id); 
         map.put(KEY_NOTE_SUBJECT, subject); 
         map.put(KEY_NOTE_DATE, date); 

         noteList.add(map); 
        } 

       } else { 

        finish(); 
        Toast.makeText(getApplicationContext(), 
          jSon.getString(KEY_ERROR_MSG), Toast.LENGTH_SHORT).show(); 

        Log.i("AllNotes >> No nightly >>", "..."); 

        Intent i = new Intent(getApplicationContext(), login.class); 
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(i); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     protected void onPostExecute(String file_url) { 
      pDialog.dismiss(); 

      runOnUiThread(new Runnable() { 

       public void run() { 
        ListAdapter adapter = new SimpleAdapter(AllNotes.this, 
          noteList, R.layout.list_item, new String[] { 
            KEY_NOTE_ID, KEY_NOTE_SUBJECT, 
            KEY_NOTE_DATE }, new int[] { 
            R.id.list_lbl_id, R.id.list_lbl_subject, 
            R.id.list_lbl_date }); 
        setListAdapter(adapter); 
       } 
      }); 
     } 
    } 
} 

로그 캣의 JSON :

11-08 22:17:44.467: I/getAllNotes params before getting from net >>(599): [tag=getNotesList, user_id=1] 
11-08 22:17:47.647: I/Input stream >>(599): [email protected] 
11-08 22:17:47.767: I/JSON string builder >>(599): a{"error":"1","error_message":"\u0634\u0645\u0627 \u0647\u0646\u0648\u0632 \u0634\u0628\u0627\u0646\u0647 \u0627\u06cc \u0646\u0646\u0648\u0634\u062a\u0647 \u0627\u06cc\u062f."} 
11-08 22:17:47.797: I/getAllNotes params after getting from net >>(599): {"error":"1","error_message":"dont have any note"} 
11-08 22:17:47.797: I/AllNotes >> jSon >>(599): {"error":"1","error_message":"dont have any note"} 

답변

1

문제의 가장 큰 원인이 라인입니다. getString() 키를 찾을 수 없으면 로그 아웃 한 JSON 데이터에 "성공"키가 없으면 예외가 발생합니다. 이 예외는 사실 이후에 작성한 코드를 전혀 호출하지 않기 때문에 아무 일도 일어나지 않는 것입니다.

몇 가지 다른 것들을 참고 사항 :

  1. success == "1"은 문자열 평등을 할 수있는 적절한 방법이 아니다. == 연산자는 객체 동등성 (동일한 객체)을 검사합니다. 두 문자열이 같은지 확인하려면 success.equals("1") 대신 확인하십시오.
  2. onPostExecute()은 항상 메인 스레드에서 호출됩니다. 이 방법으로 runOnUiThread() 번으로 전화 할 필요가 없습니다. 중복되어 있습니다.
  3. 이전처럼 백그라운드 스레드에서 활동을 시작하는 것이 기술적으로 가능하지만 이런 식으로 토스트를 표시 할 수는 없습니다. 예외를 수정하면 Toast.makeText() 행은 주 스레드가 아닌 다른 스레드에서 토스트를 표시 할 수 없기 때문에 실패하게됩니다. 일반적으로

, 그것은 주 스레드에서 모든 UI 작업을 수행하는 것이 가장 좋습니다 디자인의 포인트로는 조작 정도가 적절한시기에 호출 할 수 있습니다 onPostExecute()으로 화면을 변경하는 코드를 이동해야합니다. 그것이 바로 그 때문입니다.

+0

어떻게 KEY_SUCCESS가 jSon에 존재한다는 것을 알 수 있습니까? –

+0

나는 이것을'jSon.has (KEY_SUCCESS)'로하고 올바르게 작동한다. –

+0

'optString()'을 사용할 수도 있습니다. 키가 없으면 완전히 날아 가지 않고 단순히 null을 반환합니다. – Devunwired

0

이 까다로운 가져옵니다. 주의 할 사항 :

Intent i = new Intent(getApplicationContext(), login.class); 

로그인 클래스의 유형이 매니페스트에 있는지 확인하십시오. 일반적으로 인스턴스화 된 변수가 아니라 클래스의 이름으로 클래스를 참조합니다. 솔직히 차이는 없어야하지만 노력할 가치가 있습니다.

때로는 다른 컨텍스트를 사용하여 이상한 부작용을 얻습니다. startActivity는 꽤 민감하다고 생각합니다. AllNotes.this를 사용하여 실행중인 활동의 컨텍스트를 가져올 수 있습니다. UI 스레드에서 실행해야 할 가능성이 희박하므로 작동하지 않는 경우 runOnUiThread()를 시도 할 수 있습니다.

String success = jSon.getString(KEY_SUCCESS); 

당신은 게시하지 못했지만, 나는 그 마지막 줄 아래 JSONException 스택 추적이 내기 할 것이다 :

관련 문제