2016-04-10 12 views
0

ボレーではデータが返ってきません。 私の活動では、Listを取得する方法を作成しました。以下はボレーのonResponseのデータを取得していません

PackageActivity.java

private List<Package> preparePackageData() { 
    MakeNetworkRequest data = new MakeNetworkRequest(PackageActivity.this); 
    packageList = data.getAllPackage(); 
    return packageList; 
} 

私MakeNetworkRequest.java

package com.lab.demo5; 
import android.content.Context; 
import android.util.Log; 
import android.widget.Toast; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 
import java.util.List; 


public class MakeNetworkRequest{ 
    private static final String JSON_URL = "http://localhost/android/package.php"; 
    String response; 
    Context context; 
    private List<Package> packageList=null; 

    MakeNetworkRequest(Context ctx) 
    { 
     this.context=ctx; 
    } 

    protected List<Package> getAllPackage() 
    { 
     Log.d("getAllPackage","getAllPackage"); 
     sendRequest(); 
     return this.packageList; 
    } 

    public void sendRequest(){ 

     StringRequest stringRequest = new StringRequest(JSON_URL, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       Log.d("onResponse","onResponse"); 
       showJSON(response); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(context,error.toString(),Toast.LENGTH_LONG).show(); 
      } 
     }); 

     RequestQueue requestQueue = Volley.newRequestQueue(context); 
     requestQueue.add(stringRequest); 
    } 

    private void showJSON(String json){ 
     Log.d("showJSON","onResponse"); 
     ParseJSON pj = new ParseJSON(json); 
     pj.parseResult(); 
     this.packageList = pj.packageList; 

    } 
} 

である私は、ログに "getAllPackage" を取得していますが、それは、ログ "onResponse" 内のすべてのデータが表示されていません。

このコードをアクティビティに直接配置すると、同じコードで良い結果が得られます。

+1

デバッガを使用してエラーを特定してみてください。 Androidスタジオでは、ブレークポイントを設定し、 'Ctrl + F9'ボタン(またはMacの場合は' Cmd + F9')を使用してこれを行います。 [これは簡単なチュートリアルです(https://www.youtube.com/watch?v=Vo5PXWnKtQ4)。 –

+0

はい、問題をデバッグします。私がVolleyのネットワークスレッドのデータを取得しているMainthreadのデータにアクセスしているように見えます。今、メインスレッドでデータを取得する方法について質問します。私の呼び出しはこのようなものです。 PackageActivityにはrecyclerviewがあります - >ネットワークスレッド - > Listでデータを取得 - > setRecyclerview adapter->ここでnullがあります。 –

+0

Volleyはあなたのスレッドと非同期のタスクを実行するので、 "onResponse"を表示するには時間がかかります。 –

答えて

1

このエラーは、this.packageListgetAllPackages()から返すことによって発生したと思います。 nullを返し、後でthis.packageListの参照をshowJson()に変更しました。

また、私はこの代わりにコールバックを実装することをお勧めします。

protected void getAllPackage(@NonNull ResultListener listener); 

、その後onRespose()listener.onSuccess(data)のように、呼び出されたときにコールバック:このように。

また、SuccessListenerインターフェイスを自分で作成する必要があります。このような何か:

public interface ResultListener{ 
    onSuccess(List<Package> packages); 
    onError(Exception exception); 
} 

これにより、あなたはあなたの活動でこれを使用することができます。

new MakeNetworkRequest(this).getAllPackages(new MakeNetworkRequest.ResultListener(){ 
    @Override 
    onSuccess(List<Package> packages){ 

    } 
    @Override 
    onError(Exception error){ 

    } 
}); 

私はその要旨hereを作成しました。

関連する問題