2012-11-08 57 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); 
       } 
      }); 
     } 
    } 
} 

logcat的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

你的問題的最可能的原因是該行:

String success = jSon.getString(KEY_SUCCESS); 

你沒有張貼,但我敢打賭,有最後一行低於JSONException堆棧跟蹤。 getString()會在找不到密鑰時拋出異常,並且在註銷的JSON數據中沒有「成功」鍵。這個異常導致你在事後寫的所有代碼根本不會被調用,這就是爲什麼你什麼都看不到。

一對夫婦的其他注意事項:

  1. success == "1"是不是做字符串相等的正確方法。 ==運算符檢查對象是否相等(相同的對象),如果你想檢查兩個字符串是否相同,我們改爲success.equals("1")
  2. 始終在您的主線程中調用。您不必從方法中調用runOnUiThread() ...這是多餘的。
  3. 從技術角度來看,從後臺線程開始一個活動就像完成了一樣,但不能用這種方式顯示Toast。修復異常時,Toast.makeText()行最終會失敗,因爲您無法從主線程以外的線程顯示Toast。

在一般情況下,這是最好做在主線程上所有的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(),如果這不起作用的話。