0

我的代碼導致問題是在我的應用程序的MainActivity。在onCreate方法中有一個運行名爲uploadImage()的方法的Thread。這然後返回一個地圖,並在uploadedImage(一個地圖實例)中設置。在線程後,public Map uploadedImage爲空。 (它會在聲明的行上拋出一個NullPointerExeption)。有沒有人知道爲什麼uploadedImage在Thread之外被認爲是空的?謝謝!爲什麼會出現NullPointerException?

... 
public Map uploadedImage; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //only perform if there is a network connection 
    if(isNetworkAvailable()) { 

     Thread thread = new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       try { 
        //try to upload image 
        uploadedImage = uploadImage(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     thread.start(); 

     TextView txtURL = (TextView) findViewById(R.id.textView); 
     String url = uploadedImage.toString(); //NULLPOINTEREXEPTION HERE 
     txtURL.setText(url); 
    } 
} 
... 
+1

不是線程化Java的專家,但我的猜測是線程在訪問它之前沒有機會分配uploadedImage。 – 2015-03-19 03:44:21

+1

因爲你把它作爲一個新的線程。使用asynctask然後把它們放在onPostExecute()。或者把它們放到你的線程中,然後用runOnUiThread()調用開頭< - 我還沒有試過這個 – 2015-03-19 03:45:31

+1

你現在這樣做的方式,你沒有保證'uploadedImage'將會在你點擊' String url = uploadedImage.toString();'。你看到了嗎?我不知道你在'uploadImage()'中做了什麼樣的操作,但是你可能想設置一個回調來知道你的任務完成的時間。 – vinitius 2015-03-19 03:48:31

回答

0

我使用了一個ASyncTask,並在onPostExecute覆蓋方法中的字符串「url」中放置了Map。 上述說任務未完成的人是正確的。感謝大家的幫助。

3

然後uploadedImagenull。此外,你應該做的是調用同步,因爲此調用

String url = uploadedImage.toString(); 

明確要求uploadedImage被初始化,而不是null;

if(isNetworkAvailable()) { 
    try { 
     //try to upload image 
     uploadedImage = uploadImage(); 
     TextView txtURL = (TextView) findViewById(R.id.textView); 
     String url = (uploadedImage != null) ? 
       uploadedImage.toString() : "null"; 
     txtURL.setText(url); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+2

另外,請查看[Loaders](http://developer.android.com/guide/components/loaders.html),它們「可以輕鬆異步地將數據加載到活動或片段中」。爲您的視圖定義_nice_默認值,然後在更多數據可用時更新它們可以爲您的用戶提供更具響應性(或令人愉快)的體驗。 – 2015-03-19 03:52:31

0

方法uploadImage()的代碼在哪裏?檢查裏面發生了什麼,爲什麼它會返回null?

相關問題