2012-12-07 27 views
0

我米卡在問題從一個時間。 這是我的代碼AsyncTast onPostExecute不更新UI元素:拋出的NullPointerException

public class PilgrimFriendActivity extends Activity { 

    private String DOMAIN = "http://"; 

    private String LAWS_URL = ""; 
    private String LOCATIONS_URL = ""; 

    private ListView list; 
    private TextView content; 
    private Law law ; 
    private Location location; 
    private ProgressDialog dialog; 
    private SharedPreferences preferences; 


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

     preferences = getSharedPreferences("com.hackontech.pilgrim_preferences", MODE_PRIVATE); 
     this.DOMAIN += preferences.getString("DOMAIN","192.168.0.104"); 
     this.LAWS_URL = DOMAIN + "/pilgrimfriend/main/getAllLaws"; 
     this.LOCATIONS_URL = DOMAIN + "/pilgrimfriend/main/getAllLocations"; 

     dialog = new ProgressDialog(this); 
     content = (TextView) findViewById(R.id.content); 
     list = (ListView) findViewById(R.id.laws); 
     this.lLaws(); 

    } 


    public void lLaws() { 

     final class RequestTask extends AsyncTask<String, String, String>{ 

      private String URL = null; 

      @Override 
      protected String doInBackground(String... uri) { 
       String result = null; 
       URL = uri[0]; 
       try { 

        //Create default http client 
        HttpClient httpclient = new DefaultHttpClient(); 
        HttpGet httpget = new HttpGet(URL); 
        Log.v("URL",URL); 
        HttpResponse response = httpclient.execute(httpget); 
        //Retrieve the response body or "entity" 
        HttpEntity entity = response.getEntity(); 
        //Return the entity as String 
        result = EntityUtils.toString(entity); 
        Log.v("result",result.toString()); 

       } catch (Exception e) { 
        return e.getMessage(); 
       } 

       return result; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       //super.onPostExecute(result); 
       dialog.dismiss(); 
       try{ 

        JSONArray jArray = new JSONArray(result); 

        JSONObject json_data; 
        ArrayList<String> items = new ArrayList<String>(); 
        for(int i=0; i < jArray.length() ; i++) { 
         json_data = jArray.getJSONObject(i); 
         int id=json_data.getInt("id"); 
         String title=json_data.getString("title"); 
         String scholor =json_data.getString("scholor"); 
         items.add(title+" ("+scholor+")"); 
        } 

        content.setText(result); 
        ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<String>(getApplicationContext(), 
          android.R.layout.simple_list_item_1, items); 
        list.setAdapter(mArrayAdapter); 

        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 

       } 
       catch(JSONException e) { 
        //content.setText(e.getMessage()); 
       } 
       //Do anything with response.. 
      } 

      @Override 
      protected void onPreExecute() { 
       // TODO Auto-generated method stub 
       super.onPreExecute(); 

       dialog.setTitle("Downloading Laws Data"); 
       dialog.show(); 
      } 

     } 

     new RequestTask().execute(LAWS_URL); 
    } 

我的每一個方法的工作,但在onPostExecute當我改變視圖元素像我一樣content.setText(result),應用程序會立即停止,有什麼問題。

這裏是LogCat

12-07 22:44:33.302: E/AndroidRuntime(778): FATAL EXCEPTION: main 
12-07 22:44:33.302: E/AndroidRuntime(778): java.lang.NullPointerException 
12-07 22:44:33.302: E/AndroidRuntime(778): at com.hackontech.pilgrim.PilgrimFriendActivity$1RequestTask.onPostExecute(PilgrimFriendActivity.java:120) 
12-07 22:44:33.302: E/AndroidRuntime(778): at com.hackontech.pilgrim.PilgrimFriendActivity$1RequestTask.onPostExecute(PilgrimFriendActivity.java:1) 
12-07 22:44:33.302: E/AndroidRuntime(778): at android.os.AsyncTask.finish(AsyncTask.java:417) 
12-07 22:44:33.302: E/AndroidRuntime(778): at android.os.AsyncTask.access$300(AsyncTask.java:127) 
12-07 22:44:33.302: E/AndroidRuntime(778): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
12-07 22:44:33.302: E/AndroidRuntime(778): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-07 22:44:33.302: E/AndroidRuntime(778): at android.os.Looper.loop(Looper.java:123) 
12-07 22:44:33.302: E/AndroidRuntime(778): at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-07 22:44:33.302: E/AndroidRuntime(778): at java.lang.reflect.Method.invokeNative(Native Method) 
12-07 22:44:33.302: E/AndroidRuntime(778): at java.lang.reflect.Method.invoke(Method.java:507) 
12-07 22:44:33.302: E/AndroidRuntime(778): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-07 22:44:33.302: E/AndroidRuntime(778): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-07 22:44:33.302: E/AndroidRuntime(778): at dalvik.system.NativeStart.main(Native Method) 
+3

我猜'內容'爲空。你初始化了它嗎? –

+0

是的,我做到了,我可以更新任何其他地方,不僅是內容,列表視圖也沒有工作,總之它不是更新的用戶界面,但奇怪的是,該進程對話框顯示,麪包確實顯示 – user868900

+0

PLZ發佈LogCat –

回答

0

出於某種原因,onPostExecute方法做一次所有的UI更新,當方法已經完成。

例如: 「不要在後臺完成」

@Override 
protected Void doInBackground() { 
    someTextView.setText("Do In Background Finished!"); 
} 

@Override 
protected void onPostExecute() { 
    someTextView.setText("Post Execute Started"); 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // .. 
    } 
    someTextView.setText("Post Execute Finished"); 
} 

將導致顯示5秒後(當onPostExecute結束時)將使用「Post Execute Started」更新文本,並立即使用「Post Execute Finished」更新文本。