2

JSON 配列を取得する AsyncTask があります。次のような JSON 配列を返すにはどうすればよいですか。

JSONArray channels = new Json().execute(foo, bar);package com.example.tvrplayer;

日食は私がそれを行うことができないと私に言います、それはあるべきです:

AsyncTask<Object, Integer, JSONArray> channels = new Json().execute("http://192.168.2.136:8080/rest/channel/"+ linkid +"/"+ username, "GET");

Json 非同期クラス:

public class Json extends AsyncTask<Object, Integer, JSONArray> {

    Json(){
        super();
    }

    @Override
    protected JSONArray doInBackground(Object... params) {
        // Log.i("JSON",url);
        String url = (String) params[0];
        String method = (String) params[1];
        InputStream is = null;
        String result = "";
        JSONArray jsonObject = null;

        // HTTP
        try {
            HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests!
            if ( method == "GET") {
                HttpGet httpget = new HttpGet(url);
                HttpResponse response = httpclient.execute(httpget);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
            } else if (method == "POST") {
                HttpPost httppost = new HttpPost(url);
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
            }


        } catch(Exception e) {
            Log.e("JSON - 1 -", e.toString());
            return null;
        }

        // Read response to string
        try {           
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();    
//          result = result.substring(1,result.length()-1);
//          Log.d("JSON result",result);
        } catch(Exception e) {
            Log.e("JSON - 2 -", e.toString());
            return null;
        }

        // Convert string to object
        try {
            jsonObject = new JSONArray(result);            
        } catch(JSONException e) {
            Log.e("JSON - 3 -", e.toString());
            return null;
        }
        return jsonObject;
    }
    @Override
    protected void onPostExecute(JSONArray result)
    {
        super.onPostExecute(result);
        final Message msg = new Message();
        msg.obj = result;
    }
}

これは私が達成しようとしているものです:

JSONArray channels = new Json().execute("http://192.168.2.136:8080/rest/channel/"+ linkid +"/"+ username, "GET");
        try {
            for (int i=0; i < channels.length(); i++) { 
                JSONObject channel_data = channels.getJSONObject(i);
                String channelID = channel_data.getString("ChannelID").toLowerCase();
                JSONArray json = new Json().execute("http://192.168.2.136:8080/rest/program/"+ linkid +"/"+ username +"/" + channelID, "GET");
4

3 に答える 3

3

returnあなたはからではありませんAsyncTaskAsyncTaskあなたはそれを一日と呼ぶ前に何かをするように指示します、しかしそれはreturnあなたに何もしません。これが「非同期」と呼ばれる理由です。あなたはそれを待たず、あなたを待たないのです。

たとえば、このコードにSyncTask:を付けます。

result = SyncTask();
label.setText(result);

これは、実行が完了するまでsetText()が実行されず、が生成されることを意味します。同期です。代わりに、asyncを使用すると、次のようになります。SyncTask()result

new AsyncTask() {
    @Override
    void onPostExecute(result) {
        label.setText(result)
    }
}.start()

これは、まったく新しい問題の世界をもたらします。Loaders同様に機能しますが、より強力な抽象化を提供する、を確認することをお勧めします。

また、私があなたにこれを言っているという事実は、あなたが理解していないことがたくさん起こっていることを意味します。関連するドキュメント、チュートリアル、または記事をグーグルで検索することをお勧めします。

于 2013-02-21T15:59:16.957 に答える
1

ASyncTask から何も返す必要はありません

@Override
protected void onPostExecute(JSONArray result)
{
    super.onPostExecute(result);
    channels = result
    //<here you can use channels to integrate with other code>
}

ここでチャネルはクラス変数として宣言されます

 JSONArray channels;
于 2013-02-21T16:01:36.380 に答える
0

Asynctaskからexecute(Runnable runnable)はvoidを返します。

次のようなonPostExecute()で結果を割り当てます。

チャネル=結果; doSomething(チャネル)

于 2013-02-21T15:59:59.793 に答える