Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JSON响应设置为微调器中的第一项_Java_Android_Json_Android Asynctask_Android Spinner - Fatal编程技术网

Java 将JSON响应设置为微调器中的第一项

Java 将JSON响应设置为微调器中的第一项,java,android,json,android-asynctask,android-spinner,Java,Android,Json,Android Asynctask,Android Spinner,我有一个AsyncTask,它执行一些GoogleAPI请求并解析JSON,JSON将返回一个字符串,我需要将该字符串设置为我的主活动微调器中的第一项。这是我的任务 public class CountyData extends AsyncTask<Object, String, String> { String geoData; String url; @Override protected String doInBackground(Object... params) {

我有一个AsyncTask,它执行一些GoogleAPI请求并解析JSON,JSON将返回一个字符串,我需要将该字符串设置为我的主活动微调器中的第一项。这是我的任务

public class CountyData extends AsyncTask<Object, String, String> {
String geoData;
String url;

@Override
protected String doInBackground(Object... params) {
    try {
        Log.d("GetGeoData", "doInBackground entered");
        url = (String) params[0];
        DownloadUrl downloadUrl = new DownloadUrl();
        geoData = downloadUrl.readUrl(url);
        Log.d("GeoData", geoData);
        Log.d("GeoReadTask", "doInBackground Exit");
    } catch (Exception e) {
        Log.d("GeoReadTask", e.toString());
    }
    return geoData;
}

@Override
protected void onPostExecute(String result) {
    Log.d("GeoReadTask", "onPostExecute Entered");
    String geoCounty = null;
    DataParser dataParser = new DataParser();
    geoCounty =  dataParser.parse(result); //I need to set this String as the first item in my spinner
    Log.d("GooglePlacesReadTask", "onPostExecute Exit");
}
公共类CountyData扩展异步任务{
字符串地理数据;
字符串url;
@凌驾
受保护的字符串doInBackground(对象…参数){
试一试{
Log.d(“GetGeoData”,“输入doInBackground”);
url=(字符串)参数[0];
DownloadUrl DownloadUrl=新的DownloadUrl();
geoData=downloadUrl.readUrl(url);
Log.d(“地理数据”,地理数据);
Log.d(“GeoReadTask”、“doinbackgroundexit”);
}捕获(例外e){
Log.d(“GeoReadTask”,例如toString());
}
返回地理数据;
}
@凌驾
受保护的void onPostExecute(字符串结果){
Log.d(“GeoReadTask”,“onPostExecute输入”);
字符串geoCounty=null;
DataParser DataParser=新的DataParser();
geoCounty=dataParser.parse(result);//我需要将此字符串设置为微调器中的第一项
Log.d(“GooglePlacesReadTask”、“onPostExecute退出”);
}
}

geoCounty字符串是我需要返回到我的主要活动并设置为spinner中的第一项的字符串。我的主要活动是:

public class MainActivity extends AppCompatActivity{

private Spinner spinner1;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

this.spinner1 = (Spinner) findViewById(R.id.listView1);

 ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, counties);
        this.spinner1.setAdapter(adapter1);
public类MainActivity扩展了AppCompatActivity{
私人纺纱机1;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.spinner1=(Spinner)findViewById(R.id.listView1);
ArrayAdapter adapter1=新的ArrayAdapter(这是android.R.layout.simple\u下拉列表\u item\u 1line,县);
这个。喷丝头1。设置适配器(适配器1);

如何从onPostExecute返回字符串并将其设置为微调器中的第一项?谢谢!

此问题有两种解决方案

1.接口

在Android中,使用任何其他类接口来传递数据。 您可以将asynctask的OnPostExecute中的数据直接发送到MainActivity并更新微调器值。为此,请学习Android中的接口

2.同一类别代码

在要修改/更新的视图组件所在的同一活动类中写入asynctask是另一种解决方案。
如果asynctask是该活动的子类,则可以直接在onPostExecute中修改微调器对象。使用progressDialogs可避免UI出现问题。

创建一个界面以与
MainActivity

public class CountyData extends AsyncTask<Object, String, String> {

    private OnDownloadCompleteListener mListener;

    CountyData(OnDownloadCompleteListener listener) {
        mListener = listener;
    }

    @Override
    protected String doInBackground(Object... params) {
        ...
        ...
        return geoData;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        ...
        ...
        mListener.onDownloadComplete(s);
    }

    public interface OnDownloadCompleteListener {
        void onDownloadComplete(String result);
    }
}
public class MainActivity extends AppCompatActivity implements CountryData.OnDownloadCompleteListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);

        ...
        ...
    }

    @Override
    public void onDownloadComplete(String result) {
       // populate the spinner adapter item here 
    }
}

到底是什么问题?只需初始化
onPostExecute
中的微调器内容,即可创建自定义适配器,并在
onPostExecute
中添加字符串,并通知适配器数据更改无法将其发送到我的主活动?@Pop使用接口从
Co将数据发送到
MainActivity
untyData#onPostExecute()
@android_hub您能给我一些如何实现这一点的指导吗?当我在onPostExecute中调用我的方法时,它会给出一个NullPointerException。这里:mListener.onDownloadComplete(s);您如何在活动中调用CountryData?您需要初始化侦听器我在onCreate方法中执行此操作:CountyData getcounty=new CountyData();getcounty.execute(data);我必须执行其他操作吗?您需要使用new CountyData(OnDownloadCompleteListener listener)构造函数初始化侦听器