0

Android アプリを実行するには、いくつかの基本的なデータが必要です。このデータは、JSON を使用してサーバーからダウンロードされます。Xcode では単純に sendsynchronous リクエストを使用しましたが、メイン 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;
            }
       }
4

1 に答える 1

0

getAppIDメソッドは、非同期で計算される結果を返すことができないことを理解する必要があります。

たとえば、アプリIDが利用可能になったときに通知するために、非同期タスクにリスナーを提供できます。

    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);
    }
}
于 2012-11-27T13:31:26.803 に答える