gridview片段中的AsyncTask意外退出

时间:2014-09-08 08:02:09

标签: android gridview android-fragments android-asynctask

我正在使用包含Gridview的片段上的AsyncTask来显示图像库。 当涉及到执行时,它会意外退出

threadid=10: thread exiting with uncaught exception (group=0x4001d5a0)

我使用TitlePageIndicator和ViewPager作为基础使用片段的空白活动 我不知道我必须做什么替代方案,即使活动和gridview捕获不是null。请帮帮我。

以下是我的基本活动和fragmentAdapter:

的活动:

public class DialogTestActivity extends FragmentActivity {

    TestFragmentAdapter mAdapter;
    ViewPager mPager;
    PageIndicator mIndicator;
    TitlePageIndicator indicator;
    public static String [] tabSelection ; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        getActionBar().setBackgroundDrawable(new ColorDrawable(Color.BLACK));
    //  tabSelection = getResources().getStringArray(R.array.tab_selection);
        mAdapter = new TestFragmentAdapter(getSupportFragmentManager());
        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
        indicator = (TitlePageIndicator) findViewById(R.id.indicator);
        indicator.setViewPager(mPager);

    }
}

FragmentAdapter:

public class TestFragmentAdapter extends FragmentPagerAdapter implements
IconPagerAdapter{
    protected static final String[] CONTENT = new String[] {
        "This", "Is", "A", "Test" , "Too"   
    };

    private int mCount = CONTENT.length;

    public TestFragmentAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getIconResId(int index) {
        // TODO Auto-generated method stub
        return 0;
    }

    public static String weblink = "";
    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch(position){
        case 0:
            weblink = "https://spreadsheets.google.com/feeds/list/0AqFbGbqKGPjAdGNPdGUtQ3dlSmoydU45ZXd6cGE4eGc/1/public/basic?alt=json";
            fragment = new DialogFragment();// <-- should be a new fragment that you use
            break;
        case 1:
            weblink = "https://spreadsheets.google.com/feeds/list/0AqFbGbqKGPjAdGNPdGUtQ3dlSmoydU45ZXd6cGE4eGc/2/public/basic?alt=json";
            fragment = new DialogFragment(); // <-- should be a new fragment that you use
            break;
        case 2:
            weblink = "https://spreadsheets.google.com/feeds/list/0AqFbGbqKGPjAdGNPdGUtQ3dlSmoydU45ZXd6cGE4eGc/3/public/basic?alt=json";
            fragment = new DialogFragment(); 
            break;
        case 3:
            weblink = "https://spreadsheets.google.com/feeds/list/0AqFbGbqKGPjAdGNPdGUtQ3dlSmoydU45ZXd6cGE4eGc/4/public/basic?alt=json";
            fragment = new DialogFragment();
            break;
        case 4:
            weblink = "https://spreadsheets.google.com/feeds/list/0AqFbGbqKGPjAdGNPdGUtQ3dlSmoydU45ZXd6cGE4eGc/5/public/basic?alt=json";
            fragment = new DialogFragment();
            break;  
        }
        return fragment;
    }

    @Override
    public int getCount() {
        return mCount;
    }

    @Override
    public CharSequence getPageTitle(int position){
        String title = "";
        switch(position){
        case 0:
            title = "Fragment 1";
            break;
        case 1:
            title = "Fragment 2";
            break;
        case 2:
            title = "Fragment 3";
            break;
        case 3:
            title = "Fragment 4";
            break;
        case 4:
            title = "Fragment 5";
            break;  
        }

        return title;
    }

    public void setCount(int count){
        if (count > 0 && count < 10){
            mCount = count;
            notifyDataSetChanged();
        }
    }


}

以下是我的健身代码:

package com.example.dialog;

import java.lang.ref.WeakReference;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;

public class DialogFragment extends Fragment {

    private String weblink ;


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        super.onCreateView(inflater, container, savedInstanceState);
        View rootView = inflater.inflate(R.layout.photolistfragment, container, false);
        GridView content = (GridView) rootView.findViewById(R.id.gridview);
        content.setBackgroundColor(Color.BLACK);
        setRetainInstance(true);
        weblink = TestFragmentAdapter.weblink;
        String[] execute = {weblink};
        DownloadDialog asyncTask = new DownloadDialog(getActivity() , content);
        asyncTask.execute(execute);
        return rootView;
    }


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

        GridView mGridView;
        Activity activity;

        public DownloadDialog(final Activity parent, GridView gv) {
            //dialog = new ProgressDialog(parent);
            this.mGridView=gv;
            this.activity=parent;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            System.out.println(result);
            try {
                JSONObject json = new JSONObject(result);
                JSONObject jsonData = json.getJSONObject("feed");
                JSONArray jsonArray = jsonData.getJSONArray("entry");
                ArrayList<DialogPic> ct = new ArrayList<DialogPic> ();
                for(int i = 0 ; i < jsonArray.length() ; i++){
                    DialogPic dpDialogPic = new DialogPic ();
                    JSONObject jsD = jsonArray.getJSONObject(i);            
                    JSONObject jsC = jsD.getJSONObject("content");
                    String jsV = jsC.get("$t").toString();
                    int length = jsV.length();
                    String urlString = jsV.substring(6, length);
                    dpDialogPic.setCode(urlString);
                    ct.add(dpDialogPic);
                }
                DialogPicAdapter itemAdapter = new DialogPicAdapter(activity.getApplicationContext(), R.layout.diapic_row, ct);
                mGridView.setAdapter(itemAdapter);
                mGridView.setCacheColorHint(0);
                mGridView.setOnItemClickListener(new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
                        //do something on click
                        DialogPic   selectedDialogPic = (DialogPic) mGridView.getItemAtPosition(position);
                        Intent i = new Intent();
                        i.putExtra("dialog", selectedDialogPic.getCode() );
                        activity.setResult(-1, i); //-1 :result OK 
                        activity.finish();
                    }
                });
            }catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected String doInBackground(String... uid) {
            //      submitAllBuildResult(uid[0]);
            String result = new WebAccess().getGoogleDocs(uid[0]);
            //String result = "";
            return result;
        }
    }

}

布局

1 个答案:

答案 0 :(得分:2)

您的错误消息表示您在后台工作期间遇到异常。 AsyncTask使用doInBackground()方法执行后台工作,因此问题出在new WebAccess().getGoogleDocs(uid[0]);调用中。

将其包裹在try-catch块中并调查您Exception到达那里的情况。我建议你调试getGoogleDocs()方法,它可能已经坏了。

如果您有时只收到此错误,请为try-catch块添加一些重试机制。通常,Web操作的重试次数为5。