2012-11-27 67 views
0

我的Android應用程序需要一些基本數據才能運行。這些數據是使用JSON從服務器下載的。在Xcode中,我簡單地使用了發送同步請求,但是我注意到當我在主UI上進行聯網時,Eclipse給了我一個錯誤。 在asynctask上發現了很多東西,但我希望我的應用程序等待下載所需數據(同步?)。我試過使用asynctask .execute()。get()並在onPostExecute中設置變量,但是當我返回變量時,我得到一個NullPointerException異常。有人知道如何使這項工作?在應用程序運行之前,我真的需要這些數據,所以我希望我的應用程序能夠等待數據下載。在主用戶界面上執行網絡進程

MainActivity調用此:

SingletonClass appIDSingleton = SingletonClass.getInstance(); 
this.ID = appIDSingleton.getAppID(); 

單例類:

public String getAppID() { 
      try { 
      new DownloadAppID().execute(APP_ID_URL).get(5000, TimeUnit.MILLISECONDS); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TimeoutException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
      return AppID; //AppID is still NULL (because the download isnt finished yet?) 
     } 

private class DownloadAppID extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        HttpResponse execute = client.execute(httpGet); 
        InputStream content = execute.getEntity().getContent(); 

        BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
        String s = ""; 
        while ((s = buffer.readLine()) != null) { 
         response += s; 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      System.out.println(result); 
      AppID = result; 
      } 
     } 
+1

你在哪裏得到NullPointerException異常? – Yahor10

+1

編輯我的帖子。我在getAppID方法返回時得到空值 –

+0

您在哪裏調用這些行? SingletonClass appIDSingleton = SingletonClass.getInstance(); this.ID = appIDSingleton.getAppID(); :) – Yahor10

回答

0

你要明白,你的getAppID方法不能返回將被異步計算的結果。

你可以例如提供一個監聽器,你的異步任務,以便通知時,應用程序號:

SingletonClass appIDSingleton = SingletonClass.getInstance(); 
    appIDSingleton.getAppID(new AppIdDownloadListener() { 

     @Override 
     public void appIDAvailable(String appId) { 
      this.ID = appId; 
     } 
    }); 


public void getAppID(AppIdDownloadListener listener) { 
    try { 
     new DownloadAppID(listener).execute(APP_ID_URL).get(5000, TimeUnit.MILLISECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TimeoutException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public interface AppIdDownloadListener { 
    public void appIDAvailable(String appId); 
} 

private class DownloadAppID extends AsyncTask<String, Void, String> { 

    private AppIdDownloadListener listener; 

    public DownloadAppID(AppIdDownloadListener listener) { 
     this.listener = listener; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     /* Your stuff here */ 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     System.out.println(result); 
     listener.appIDAvailable(result); 
    } 
} 
+0

這對我有效!它有點不同,但你的答案涵蓋了一切!謝謝 –

+0

最後一個問題。這是處理來自Web的JSON數據的正確方法嗎? –

+1

聽起來不錯,儘管你可能會擺脫這種'getAppID'方法我猜。 – fiddler