1


JSONparserを使用してリモートのmySQLデータベースでいくつかの値を取得していましたが、Android 3.0以降(Honeycomb)でテストするまでは正常に機能していました.Android 3.0以降(Honeycomb)では、プロセスがメインスレッドでネットワーク操作を実行できないガーディアンがあります。 .

だから私はAsynctaskが必要であることを発見しました: How to fix android.os.NetworkOnMainThreadException?


そして、このトピックを試しました:

AsyncTask から返された JSON を取得する

AsyncTask から JSON 配列を返す

asynctask からデータを返す方法


これで、asynctask が値を返せないことがわかりましたが、この json 値を取得する必要があります。これは、さまざまなアクティビティで、それを処理したり、情報を画面に表示したりするのを待っている呼び出しが多数あるためです (そのため、実行できません)。それは OnPostExecute にあると思います)。


これが私の古い JsonParser からいくつかの適応を加えたクラスです。

JSONParser.java

public class JSONParser extends AsyncTask<List<NameValuePair>, Void, JSONObject> {

    static InputStream is = null;
    static JSONObject jObj = null;
    static JSONObject result = null;
    static String json = "";

    private static String jsonURL = "http://192.168.1.119/Server/db/json/";

    private ProgressDialog progressDialog;

    // constructor
    public JSONParser() {

    }

    @Override
    protected void onPreExecute() {
        //progressDialog = new ProgressDialog();
        progressDialog.setMessage("Aguarde...");
        progressDialog.show();
    }

    protected JSONObject doInBackground(List<NameValuePair>... params) {

        // Making HTTP request
        try {

            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(jsonURL);
            httpPost.setEntity(new UrlEncodedFormEntity(params[0]));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "n");
            }
            is.close();
            json = sb.toString();
            Log.e("JSON", json);
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);            
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }


    protected void onPostExecute(JSONObject jObj) {

        result = jObj;
        progressDialog.dismiss();

    }

    public JSONObject getJson(List<NameValuePair> params){

        this.execute(params);

        return result;

    }

}


UserFunctions.java (一部の呼び出し例)

(...)

public UserFunctions(){
    JSONParser jsonParser = new JSONParser();
}

public JSONObject loginUser(String email, String password){
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", login_tag));
    params.add(new BasicNameValuePair("email", email));
    params.add(new BasicNameValuePair("password", password));

    JSONObject json = jsonParser.getJson(params);
    //JSONObject json = jsonParser.execute(params); //doesn't return
    return json;
}
public JSONObject listProjects(String email){
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", list_projects));
    params.add(new BasicNameValuePair("email", email));

    JSONObject json = jsonParser.getJson(params);
    return json;
}

public JSONObject setDisp(String dispID, String disp, String comment){
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", set_disp));
    params.add(new BasicNameValuePair("dispID", dispID));
    params.add(new BasicNameValuePair("disp", disp));
    params.add(new BasicNameValuePair("comment", comment));

    JSONObject json = jsonParser.getJson(params);
    return json;
}

(...)



値を var (JSONObject 結果) に渡そうとしましたが、効果はありません。(NullPointerException、非同期が終了する前に変数にアクセスしようとしていると思います。それは「非同期」だからです)

値を取得するにはどうすればよいですか? 何か案は?


どうもありがとう!

4

1 に答える 1

1

の使用に慣れるAsyncTaskと、多くのことが必要になります。

タスクが完了したときに何かをトリガーする必要がある場合は、ブロードキャストします。関心のあるすべての人 (他の活動を含む) は、ブロードキャストの受信機を登録する必要があります。

あなたのAsyncTask

new AsyncTask<Void,Void,List<Result>>() {
  @Override
  public List<Result> doInBackground(Void... voids) {
    final List<Result> results = ...; // get from network, or whatever
  }

  @Override
  public void onPostExecute(List<Result> results) {
    Intent intent = new Intent("com.my.action.RESULTS_READY"); // or whatever
    intent.putExtra("com.my.extra.RESULTS", new ArrayList<Result>(results);
    sendBroadcast(intent);
  }
}.execute();

onCreate()次に、他のアクティビティで、とでこれを登録/登録解除しonDestroy()ます。一時停止しているときにブロードキャストを受信し、インスタンス データを更新することを想定しています。

他のオプションがあることに注意してください。たとえば、結果を DB に書き込み、結果の準備が整ったことだけをブロードキャストし、各関係者が必要なときに DB から結果を取得することを期待できます。有効なデータを持つためにブロードキャストを受信することに依存しないため、おそらくより良いでしょう (これも長い例なので、その楽しみはあなたに任せます)。

于 2013-09-25T18:26:04.717 に答える