Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.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
Android 加载更多-只有创建视图层次结构的原始线程才能接触其视图_Android_Json_Gridview_Android Asynctask_Android Loader - Fatal编程技术网

Android 加载更多-只有创建视图层次结构的原始线程才能接触其视图

Android 加载更多-只有创建视图层次结构的原始线程才能接触其视图,android,json,gridview,android-asynctask,android-loader,Android,Json,Gridview,Android Asynctask,Android Loader,我的应用程序正在使用GridView从JSON获取图像。一切都很好,但现在我想让它加载更多的点击按钮。我遵循了这个教程。 当我遵循它时,我使用了runOnUiThread(newrunnable()){ public void run(){}在doInBackground中,但它会出错networkonmainthreadeception我知道这一点,因为我在UI线程上运行它。但是当我删除runOnUiThread…时,它也会出错 如何修复此错误?完整源代码 首次加载时执行异步任务 // Dow

我的应用程序正在使用GridView从JSON获取图像。一切都很好,但现在我想让它加载更多的点击按钮。我遵循了这个教程。 当我遵循它时,我使用了
runOnUiThread(newrunnable()){
public void run(){}
doInBackground
中,但它会出错
networkonmainthreadeception
我知道这一点,因为我在UI线程上运行它。但是当我删除
runOnUiThread…
时,它也会出错

如何修复此错误?完整源代码

首次加载时执行异步任务

// Download JSON in Background
public class DownloadJSONFileAsync extends AsyncTask<String, Void, Void> {
    String token = getIntent().getExtras().getString("token1");

    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
    }

    @Override
    protected Void doInBackground(String... params) {
        String url = "http://xxx.xxx.xxx/card/all/"+num_page+"/0/?token="+token;
        JSONArray data = null;

        try {

            JSONObject jsonObject = new JSONObject(getJSONUrl(url));
            MyArrList = new ArrayList<HashMap<String, Object>>();
            HashMap<String, Object> map;
            data = jsonObject.getJSONArray("data");

            for (int i = 0; i < data.length(); i++) {
                JSONObject c = data.getJSONObject(i);
                map = new HashMap<String, Object>();

                // Thumbnail Get ImageBitmap To Object
                map.put("cardimage", (String) c.getString("cardimage"));
                map.put("ImageThumBitmap",(Bitmap) loadBitmap(c.getString("cardimage")));
                map.put("categoryid", (String) c.getString("categoryid"));
                MyArrList.add(map);
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void unused) {
        ShowAllContent(); // When Finish Show Content
        dismissDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
        removeDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
    }

}
//在后台下载JSON
公共类下载JSonfileasync扩展异步任务{
字符串标记=getIntent().getExtras().getString(“标记1”);
受保护的void onPreExecute(){
super.onPreExecute();
showDialog(DIALOG\u下载\u JSON\u进度);
}
@凌驾
受保护的Void doInBackground(字符串…参数){
字符串url=”http://xxx.xxx.xxx/card/all/“+num_page+”/0/?token=“+token;
JSONArray数据=null;
试一试{
JSONObject JSONObject=新的JSONObject(getJSONUrl(url));
MyArrList=newarraylist();
HashMap图;
data=jsonObject.getJSONArray(“数据”);
对于(int i=0;i
使用按钮单击以加载更多内容时的AsycTask

// load more

public class LoadMore extends AsyncTask<String, Void, Void> {

    String token = getIntent().getExtras().getString("token1");

    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
    }

    @Override
    protected Void doInBackground(String... params) {
                num_page += 1;
                String url = "http://xxx.xxx.xxx/card/all/"+num_page+"/0/?token="+token;
                JSONArray data = null;

                try {

                    JSONObject jsonObject = new JSONObject(getJSONUrl(url));

                    MyArrList = new ArrayList<HashMap<String, Object>>();
                    HashMap<String, Object> map;
                    data = jsonObject.getJSONArray("data");
                    for (int i = 0; i < data.length(); i++) {
                        JSONObject c = data.getJSONObject(i);
                        map = new HashMap<String, Object>();

                        // Thumbnail Get ImageBitmap To Object
                        map.put("cardimage", (String) c.getString("cardimage"));
                        map.put("ImageThumBitmap",(Bitmap) loadBitmap(c.getString("cardimage")));
                        map.put("categoryid", (String) c.getString("categoryid"));
                        MyArrList.add(map);
                    }

                    int currentPosition = gridView1.getFirstVisiblePosition();
                    ImageAdapter adapter = new ImageAdapter(CardActivity.this, MyArrList);
                    gridView1.setAdapter(adapter);
                    gridView1.setSelection(currentPosition + 1);

                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        return null;
    }

    protected void onPostExecute(Void unused) {
        ShowAllContent();
        dismissDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
        removeDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
    }

}
//加载更多
公共类LoadMore扩展异步任务{
字符串标记=getIntent().getExtras().getString(“标记1”);
受保护的void onPreExecute(){
super.onPreExecute();
showDialog(DIALOG\u下载\u JSON\u进度);
}
@凌驾
受保护的Void doInBackground(字符串…参数){
页数+=1;
字符串url=”http://xxx.xxx.xxx/card/all/“+num_page+”/0/?token=“+token;
JSONArray数据=null;
试一试{
JSONObject JSONObject=新的JSONObject(getJSONUrl(url));
MyArrList=newarraylist();
HashMap图;
data=jsonObject.getJSONArray(“数据”);
对于(int i=0;i
您可能应该移动此代码:

                int currentPosition = gridView1.getFirstVisiblePosition();
                ImageAdapter adapter = new ImageAdapter(CardActivity.this, MyArrList);
                gridView1.setAdapter(adapter);
                gridView1.setSelection(currentPosition + 1);

进入
onPostExecute
方法,因为它必须在UI线程上运行
gridView1.setSelection(currentPosition+1);?
中的
1
是什么意思?
因为我将其更改为0,它工作得很好非常感谢,你的ans。节省了我的很多时间……谢谢,我需要在pnPostExecute()上添加我的setadaper而不是在后台
                int currentPosition = gridView1.getFirstVisiblePosition();
                ImageAdapter adapter = new ImageAdapter(CardActivity.this, MyArrList);
                gridView1.setAdapter(adapter);
                gridView1.setSelection(currentPosition + 1);