【问题标题】:Loading content before UI shows up (using AsyncTask and ViewPager)在 UI 显示之前加载内容(使用 AsyncTask 和 ViewPager)
【发布时间】:2014-12-14 14:59:27
【问题描述】:

我试图弄清楚如何在运行 UI 和设置 ViewPager 适配器之前从服务器下载内容。我的服务器上有 JSON 文件,应用程序可以正确读取,但我无法更新 ViewPager。

理想情况下,我想做的是制作一个对话框,上面写着“请稍候,我们正在检查是否有任何新内容”,并带有循环加载的东西(只是为了表明它正在工作),如果是的话 - 到下载它并使内容新鲜,如果不使用最后的内容。

现在看起来是这样的。它按原样工作 - 我应该从哪里获取它?

public class MainActivity extends Activity {

MediaPlayer mp;
ViewPager viewPager;
PagerAdapter adapter;
//int[] sounds;
int[] g;
String[] title;
int[] description;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewpager_main);

    // Generate data

    title = new String[] { "A1", "A2", "A3","A4" };

    description = new int[] { R.string.a1, R.string.a2, R.string.a3, R.string.a4 };

    gun = new int[] {R.drawable.obr4,R.drawable.obr4,R.drawable.obr4,R.drawable.obr4};

    // Locate the ViewPager in viewpager_main.xml
    viewPager = (ViewPager) findViewById(R.id.pager);
    // Pass results to ViewPagerAdapter Class
    adapter = new ViewPagerAdapter(MainActivity.this, g, title,
            description);
    // Binds the Adapter to the ViewPager
    viewPager.setAdapter(adapter);

    if (VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        viewPager.setPageTransformer(true, new DepthPageTransformer());
    }



    new GetUpdate().execute();
}

class GetUpdate extends AsyncTask<Void, Void, Void>{

    JSONObject jobj = null;
    @Override
    protected Void doInBackground(Void... params) {             

        //JSON
        JSONParser jparser = new JSONParser();
        JSONObject data = jparser.getJSONFromUrl("http://myserver.com/file.json");                      

        String title2 = "";

        try {
            jobj = data.getJSONObject("party2");                
            title2 = jobj.getString("title");
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //title = new String[] { title2,title2,title2,title2}; <- commented 'cause doesn't work

        return null;
    }

}

【问题讨论】:

    标签: android android-asynctask android-viewpager


    【解决方案1】:

    获取新的JSON 后,只需更新适配器的源列表并在适配器对象上执行“notifyDataSetChanged()”,如下所示。

    public class MainActivity extends Activity {
    
    MediaPlayer mp;
    ViewPager viewPager;
    PagerAdapter adapter;
    //int[] sounds;
    int[] g;
    String[] title;
    int[] description;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewpager_main);
    
        // Generate data
    
        title = new String[] { "A1", "A2", "A3","A4" };
    
        description = new int[] { R.string.a1, R.string.a2, R.string.a3, R.string.a4 };
    
        gun = new int[] {R.drawable.obr4,R.drawable.obr4,R.drawable.obr4,R.drawable.obr4};
    
        // Locate the ViewPager in viewpager_main.xml
        viewPager = (ViewPager) findViewById(R.id.pager);
        // Pass results to ViewPagerAdapter Class
        adapter = new ViewPagerAdapter(MainActivity.this, g, title,
                description);
        // Binds the Adapter to the ViewPager
        viewPager.setAdapter(adapter);
    
        if (VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            viewPager.setPageTransformer(true, new DepthPageTransformer());
        }
    
    
    
        new GetUpdate().execute();
    }
    
    class GetUpdate extends AsyncTask<Void, Void, Void>{
    
        JSONObject jobj = null;
        @Override
        protected Void doInBackground(Void... params) {             
    
            //JSON
            JSONParser jparser = new JSONParser();
            JSONObject data = jparser.getJSONFromUrl("http://myserver.com/file.json");                      
    
            String title2 = "";
    
            try {
                jobj = data.getJSONObject("party2");                
                title2 = jobj.getString("title");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // Change titles to ArrayList for better usage.
            title[4] = title2;
            adapter.notifyDataSetChanged();
    
            return null;
        }
    
    }
    

    【讨论】:

    • 不会 title[4] 只是改变数组中第 4 个元素的标题吗?
    • 您有 Array 对象,其中仅初始化了 4 个项目。所以你不能在这个数组中添加一个新元素。理想情况下,您应该使用可以添加为titles.add(title2) 的ArrayList。
    • 好吧,我只是换成 ArrayList。据我所知,我无法在一行中初始化和添加项目。我必须用 .add 方法一一添加。我说的对吗?
    • 如果你有一个包含所有你需要的项目的 String[] 数组。您可以使用Arrays.asList(YOUR_STRING_ARRAY)
    • 如果我回答了您的原始问题,请随时接受它作为答案:)
    【解决方案2】:

    您可以覆盖 AsyncTask 的 onPostExecute() 方法以将更新逻辑放在那里

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多