【问题标题】:How to load Spinners by Json within AsyncTask如何在 AsyncTask 中通过 Json 加载 Spinner
【发布时间】:2014-02-10 12:59:25
【问题描述】:

我是 Android 开发新手。我想通过从 Http 请求(通过 AsyncTask)加载的 Json 数组填充微调器。我的 AsyncTask 在名为 Load_spinnrs 的单独类中。我要这样做吗?

这是我的 http 请求

try{

    String DataSendingTo="http://www.mysite.com/AppRequest/load_data";

    //HttpClient
    HttpClient httpClient = new DefaultHttpClient();

    //Post header
    HttpPost httpPost = new HttpPost(DataSendingTo);


    //Adding data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);

    nameValuePairs.add(new BasicNameValuePair("authorized","001"));



    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    // execute HTTP post request
    HttpResponse response = httpClient.execute(httpPost);


    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    StringBuilder builder = new StringBuilder();
    for (String line = null; (line = reader.readLine()) != null;) {
        builder.append(line).append("\n");
    }
    JSONTokener tokener = new JSONTokener(builder.toString());
    JSONArray finalResult = new JSONArray(tokener);


   //How to load Spinner ?????



} catch (ClientProtocolException e) {
    e.printStackTrace();

} catch (IOException e) {
    e.printStackTrace();

}

【问题讨论】:

标签: android android-asynctask android-spinner


【解决方案1】:

在你得到JSON的数组之后

你必须这样做:

final String[] items = new String[jsonArray.length()]; 

// looping through All Contacts
for(int i = 0; i < jsonArray.length(); i++){

    JSONObject c = jsonArray.getJSONObject(i);
    // Storing each json item in variable

    String name = c.getString(TAG_NAME);


    items[i]=c.getString(TAG_NAME);
    System.out.println("Hello events "+items);
}

ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, items);       

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

sp.setAdapter(adapter);

Populate an Android Spinner with JSON data from a RESTful web API

【讨论】:

  • ArrayAdapter adapter = new ArrayAdapter (this, android.R.layout.simple_spinner_item, items);给出“构造函数 ArrayAdapter(RequestSend, int, String[]) 未定义”
  • 更改 YourActvity.this 而不是 this
  • 当设置 sp.setAdapter(adapter);发生错误“只有创建视图层次结构的原始线程才能接触其视图。”
  • 在每一行之后添加日志标签,以便您了解问题的确切位置,尝试获取adapter.getCount();
【解决方案2】:

如果您在单独的类中扩展AsyncTask,那么您将需要传递您正在执行扩展的 Activity 上下文,以访问普通 java 类中的 UI 元素。为此,您可以使用 Load_spinnrs 类构造函数获取 Activity 上下文并使用 onPostExecute 访问 Spinner:

class  Load_spinnrs extends AsyncTask<String,String,String>{
Activity activity;
Context context;
public Load_spinnrs(Activity activity,Context context){
 this.activity=activity;
 this.context=context;
}
...
  @Override
  protected void onPostExecute(String result) {
   // TODO Auto-generated method stub
     //access UI elements here..
     Spinner mySpinner = (Spinner)activity.findViewById(R.id.my_spinner);   
     adapter = new ArrayAdapter<String> (context, 
                             android.R.layout.simple_spinner_item, items);
     //....  
     super.onPostExecute(result);
  }

}

对于从 Activity 传递上下文启动 AsyncTask:

 Load_spinnrs load_spin=new Load_spinnrs(this,this);
 load_spin.execute(parameters);

【讨论】:

  • @SajithaRathnayake:活动。将 Activity 上下文启动 AsyncTask 作为 new Load_spinnrs(this).execute("")
  • 我认为您必须在onCreate() 中初始化每个UI 元素,然后您可以在AsyncTask 中使用它们的对象
  • (String result) 结果会是什么?
  • @SajithaRathnayake:因为使用 AsyncTask 请参阅 [这里] (developer.android.com/reference/android/os/AsyncTask.html) 为什么我们有方法和不同的参数含义。
  • 那么如何将 Json Array 返回到 onPostExecute?
【解决方案3】:

为了便于理解,将 Load_spinnrs 类加载为主类的子类。

例如;

public class Main_Class extends Activity
{

private Spinner spinner;
       protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.userprofiles);
 //init spinner here

    }

private class Load_spinnrs extends AsyncTask<Void, Void, String>{


        @Override
        protected void onPreExecute() {

        }
        @Override
        protected String doInBackground(Void... params) {
// your http request
        }
        @Override
        protected void onPostExecute(String result) {
//update spinner here.
}


}

【讨论】:

  • 我的 AsyncTask 没问题。我想从 AsyncTask 加载微调器
【解决方案4】:

这是 AsyncTask 中的实现,用于显示加载微调器,然后在 AsyncTask 完成时将其关闭。

private class GetContacts extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        <put code here>
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
                }

}

}

【讨论】:

    【解决方案5】:

    看看这可能对你有帮助:

     GetServerData.setOnClickListener(new OnClickListener() {
     public void onClick(View v) {
    
         // Server Request URL
         String serverURL = "http://androidexample.com/media/webservice/getPage.php";
    
         // Create Object and call AsyncTask execute Method
         new LongOperation().execute(serverURL);
    
     }
    });  
    
        protected void onPreExecute() {
          // NOTE: You can call UI Element here.
    
          //UI Element
          uiUpdate.setText("Output : ");
          Dialog.setMessage("Downloading source..");
          Dialog.show();
     }
    

    了解更多详情:

    http://androidexample.com/AsyncroTask_Example_To_Get_Server_Data_-_Android_Example/index.php?view=article_discription&aid=59&aaid=84

    http://www.androidhive.info/2013/12/android-populating-spinner-data-from-mysql-database/

    最好的问候

    【讨论】:

    • 你没听懂问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2017-05-24
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多