0

URLからjsonオブジェクトを取得するアプリを作成しようとしています。これは、json オブジェクトを読み込んで解析するはずのアクティビティでクラッシュし続けるため、不必要にイライラすることがわかっています。「残念ながら、(AppName)は停止しました」というメッセージが表示されます。その後、アプリケーションを終了します。JSON からのデータが画面に表示されることはありません。アクティビティと JSON 解析を含むコードを次に示します。

package com.example.Accomplist;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * User: DESAI_628IL
 * Date: 3/1/13
 * Time: 7:34 PM
 * To change this template use File | Settings | File Templates.
 */
public class MainScreen extends Activity{
    TextView myTextView;
   // HttpClient client;
    // url to make request
    final static String url = "http://accomplist.herokuapp.com/api/v1/sharedevent/2/?format=json";

    private static final String TAG_EVENT="event"; //A JSON object within the JSON object that will be returned by JSONParse()
    private static final String TAG_DESCRIPTION="description"; //A JSON tag within the JSON object EVENT
    private static String eventString="Yo";
    static JSONObject json;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_screen);
        new JSONParse().execute(url);
    }
private class JSONParse extends AsyncTask<String, String, String> {
    HttpClient client;
    JSONObject jsonObj= null;
    @Override
    protected String doInBackground(String... jsonurl) {
        StringBuilder url= new StringBuilder(String.valueOf(jsonurl));
        HttpGet get= new HttpGet(url.toString());
        HttpResponse r= null;
        try {
            r = client.execute(get);
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        int status= r.getStatusLine().getStatusCode();
        if (status==200){
            HttpEntity e=r.getEntity();
            String data= null;
            try {
                data = EntityUtils.toString(e);
            } catch (IOException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            try {
                jsonObj = new JSONObject(data);
            } catch (JSONException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            try {
                JSONObject eventJson= jsonObj.getJSONObject(TAG_EVENT);
                eventString= eventJson.getString(TAG_DESCRIPTION);
            }
            catch (JSONException e1) {
                eventString="Couldn't Parse Data";
            }
            return eventString;
        }
        else{
            return eventString;
        }
    }
    protected void onProgressUpdate(String... progress) {
        Toast loadingToast= Toast.makeText(getApplicationContext(), "Loading", Toast.LENGTH_LONG);
        loadingToast.show();
    }
    protected void onPostExecute(String result) {
        eventString=result;
        myTextView = (TextView)findViewById(R.id.textView1);
        myTextView.setText(eventString);
    }
}
}

誰かが助けてくれることを願っています。私はこれに最も長い間立ち往生しています。私は多くのことを試しました。URL から JSON オブジェクトを取得するさまざまな方法、解析コードを別のクラスに配置する方法、その他多くの小さなことを試しました。どんな助けでも大歓迎です。LogCat エラー レポートは次のとおりです。

02-26 12:18:46.691: ERROR/ThrottleService(324): problem during onPollAlarm: java.lang.IllegalStateException: problem parsing stats: java.io.FileNotFoundException: /proc/net/xt_qtaguid/iface_stat_all: open failed: ENOENT (No such file or directory)
02-26 12:19:53.601: WARN/dalvikvm(4073): threadid=11: thread exiting with uncaught exception (group=0x40a71930)
02-26 12:19:55.121: WARN/dalvikvm(4073): threadid=12: thread exiting with uncaught exception (group=0x40a71930)
02-26 12:19:57.632: WARN/InputMethodManagerService(324): Got RemoteException sending setActive(false) notification to pid 4073 uid 10048
02-26 12:20:03.452: WARN/dalvikvm(4094): threadid=11: thread exiting with uncaught exception (group=0x40a71930)
02-26 12:20:04.744: ERROR/AndroidRuntime(4094): FATAL EXCEPTION: AsyncTask #1
        java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
        at java.util.concurrent.FutureTask.run(FutureTask.java:239)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:856)
        Caused by: java.lang.IllegalArgumentException: Illegal character in path at index 0: [Ljava.lang.String;@40d12070
        at java.net.URI.create(URI.java:727)
        at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
        at com.example.Accomplist.MainScreen$JSONParse.doInBackground(MainScreen.java:84)
        at com.example.Accomplist.MainScreen$JSONParse.doInBackground(MainScreen.java:78)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask.run(FutureTask.java:234)
        ... 4 more
02-26 12:20:10.512: WARN/InputMethodManagerService(324): Got RemoteException sending setActive(false) notification to pid 4094 uid 10048
02-26 12:20:24.401: WARN/dalvikvm(4111): threadid=11: thread exiting with uncaught exception (group=0x40a71930)
02-26 12:20:24.441: ERROR/AndroidRuntime(4111): FATAL EXCEPTION: AsyncTask #1
        java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
        at java.util.concurrent.FutureTask.run(FutureTask.java:239)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:856)
        Caused by: java.lang.IllegalArgumentException: Illegal character in path at index 0: [Ljava.lang.String;@40d12038
        at java.net.URI.create(URI.java:727)
        at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
        at com.example.Accomplist.MainScreen$JSONParse.doInBackground(MainScreen.java:84)
        at com.example.Accomplist.MainScreen$JSONParse.doInBackground(MainScreen.java:78)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask.run(FutureTask.java:234)
        ... 4 more
02-26 12:20:29.411: WARN/InputMethodManagerService(324): Got RemoteException sending setActive(false) notification to pid 4111 uid 10048
4

6 に答える 6

0

これで試してください

new JSONParse().execute("");

それ以外の

new JSONParse().execute(url);

より正確にサポートできるように、logcat メッセージを貼り付けていただけますか。

于 2013-03-07T06:06:32.423 に答える
0

このようなものを試してください..

HttpClient client = new DefaultHttpClient();
        // Perform a GET request for a JSON list
        HttpUriRequest request = new HttpGet("https://somejson.json");
        // Get the response that sends back
        HttpResponse response = null;
        try {
            response = client.execute(request);
        } catch (ClientProtocolException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
于 2013-03-07T06:07:38.833 に答える
0

のパラメーターはdoInbackgroud()配列のように機能するため、 でメソッドを呼び出すときに、このメソッドに複数の引数を渡すことができexecuteますAsyncTask。最初に渡されたパラメーターは、0th位置などに格納されます。execute メソッドにパラメーターを 1 つだけ渡しているため、そのパラメーターはその0th位置に格納されます...したがって、から URL を取得する必要があります。jsonurl[0]

試してみてください

StringBuilder url= new StringBuilder(String.valueOf(jsonurl[0]));
于 2013-03-07T06:11:53.903 に答える
0

doInBackground メソッドを次のように変更します。

  @Override
    protected String doInBackground(String... jsonurl) {
     StringBuilder url= new StringBuilder(String.valueOf(jsonurl[0]));
      HttpGet get= new HttpGet(url.toString());
      HttpResponse r= null;

現在、Web サービスからデータを取得するために間違った URL を渡しています。doInBackground メソッド内のvarargsから値を取得する方法については、次の既知の動きを参照してください。

パラメータリストの「...」はどういう意味ですか? doInBackground(文字列... params)

于 2013-03-07T06:12:08.850 に答える
0

HTTP クライアントを取得していません

設定

HttpClient httpClient = new DefaultHttpClient(); あなたの doInBackGround() で

于 2013-03-07T06:16:14.483 に答える
0

2 間違いがあります

1. StringBuilder url= new StringBuilder(String.valueOf(jsonurl[0])); 
  // jsonurl[0]

2. client = new DefaultHttpClient();                                
   // Add this line too
于 2013-03-07T06:17:06.957 に答える