0

サーバーからJSON文字列をダウンロードするプログラムがあります。私が電話をかけようとする最近まで、物事はうまくいっていました

jsonReader.execute(getUrl).get();

ここで、jsonReaderはJSON文字列をダウンロードするためのAsyncTaskであり、getUrlは実行するためのURLです。このメソッドは実行されません。奇妙なことに、私の電話では機能します

これが私のコードです

json文字列リーダーを呼び出すメソッド

private PointOfInterest getPointWithID(int id) {

    String getUrl;
    JSONReader jsonReader = new JSONReader();
    try {
        Log.d(TAG,"Trying to get ID: " + id);
        getUrl = url + String.valueOf(id);
        Log.d(TAG,"Trying to get json from: " + id); <-- Last Log line to get printed when run on emulator
        jsonReader.execute(getUrl).get();
    } catch (Exception e) {
        e.printStackTrace();
    }

    String jsonString = jsonReader.returnJSONString();
    Log.d(TAG,"Downloaded: " + jsonString);
    //System.out.println("JSON: " + jsonString);

    JSONResponse jsonResponse = JSONResponse.convertJSONToResponse(jsonString);
    //System.out.println("JSON RESPONSE " + jsonResponse);


    return jsonResponse.getPointofInterest();
}

jsonReader

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.util.Log;

/**
 * Read JSON Strings
 * @author Tom
 *
 */
public class JSONReader extends AsyncTask <String, Void, String> {

    String result;
    DefaultHttpClient  httpclient = new DefaultHttpClient(new BasicHttpParams());
    StringBuilder sb = new StringBuilder();
    String TAG = "JSONReader";

    // constructor
    public JSONReader() {
        result = "";
    }

    @Override
    protected String doInBackground(String... url) {

        Log.d(TAG, "Executing " + url); <--Does not get printed when run on emulator 

        HttpPost httppost = new HttpPost(url[0]);
        // Depends on your web service
        httppost.setHeader("Content-type", "application/json");

        try {
            HttpResponse response = httpclient.execute(httppost);

            HttpEntity entity = response.getEntity();

            InputStream inputStream = entity.getContent();

            // json is UTF-8 by default i believe
            BufferedReader reader = null;

            reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
        }catch(Exception e){

            e.printStackTrace();
        }
        return result = sb.toString();
    }

    public String returnJSONString(){

        return result;
    }

}

adbを再起動して、新しいAVDを作成しようとしましたが、何も機能しないようです。電話でテストするしかありませんが、API 17用に開発しているため、これは望ましくありません。ご協力いただきありがとうございます。

4

1 に答える 1

2

このクラスが正しく機能するために従わなければならないスレッドルールがいくつかあります。

AsyncTaskクラスはUIスレッドにロードする必要があります。これは、JELLY_BEANの時点で自動的に行われます。

タスクインスタンスは、UIスレッドで作成する必要があります。

execute(Params ...)はUIスレッドで呼び出す必要があります。onPreExecute()、onPostExecute(Result)、doInBackground(Params ...)、onProgressUpdate(Progress ...)を手動で呼び出さないでください。

タスクは1回だけ実行できます(2回目の実行が試行されると、例外がスローされます)。

于 2012-12-23T18:28:54.107 に答える