首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android网络问题

Android网络问题
EN

Stack Overflow用户
提问于 2014-10-22 15:57:58
回答 1查看 175关注 0票数 0

你好,我的应用程序有一些问题:第一次:它工作并显示我的字符串从服务器第二次:它没有显示我的字符串从服务器第三次:“已停止”我有什么问题?

代码语言:javascript
复制
public class MenuActivity extends Activity {

    private static ArrayList<Products> myProducts;
    ParseJSON parseJSON;

    final String GetMenuUrl = "http://xn--e1aybc.xn--76-6kc1ag2ab9l.xn--p1ai/get_menu.php";
    String City = "Moscow";
    String NameCinema = "Avrora";
    private ProgressDialog dialog;
    private String response;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu);
        init();
        new RequestTask().execute(GetMenuUrl);
    }

public void init(){
    myProducts = new ArrayList<Products>();
    parseJSON = new ParseJSON();
}


private void setAdapter(ArrayList<String> products){
    ListView lv = (ListView)findViewById(R.id.listProducts);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,   android.R.layout.simple_list_item_1, products);
    lv.setAdapter(adapter);
}

class RequestTask extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... params) {
        try {
            DefaultHttpClient hc = new DefaultHttpClient();
            ResponseHandler<String> res = new BasicResponseHandler();

            HttpPost postMethod = new HttpPost(params[0]);
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("city", City));
            nameValuePairs.add(new BasicNameValuePair("name_cinema",NameCinema));
            postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            response = hc.execute(postMethod, res);

            parseJSON.parse(response.toString());
            Log.d("response == ", response.toString());
            myProducts = parseJSON.getObjects();

            Log.d("firstProduc == ", myProducts.get(0).getProductName());

            ArrayList<String> products = new ArrayList<String>();
            for(int i = 0 ; i < myProducts.size(); i++){
                products.add(myProducts.get(i).getProductName());
            }
            setAdapter(products);
        } catch (Exception e) {
            System.out.println("Exp=" + e);
        }
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
        dialog.dismiss();
        super.onPostExecute(result);
    }
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(MenuActivity.this);
        dialog.setMessage("Loading...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(true);
        dialog.show();
        super.onPreExecute();
    }
}

日志上说:

代码语言:javascript
复制
10-22 16:01:50.132    1604-1604/com.example.kinofood E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at android.widget.AbsListView$RecycleBin.getScrapView(AbsListView.java:6310)
            at android.widget.AbsListView.obtainView(AbsListView.java:2139)
            at android.widget.ListView.measureHeightOfChildren(ListView.java:1246)
            at android.widget.ListView.onMeasure(ListView.java:1158)
            at android.view.View.measure(View.java:15518)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:15518)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:15518)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:15518)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
            at android.view.View.measure(View.java:15518)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
            at android.view.Choreographer.doCallbacks(Choreographer.java:562)
            at android.view.Choreographer.doFrame(Choreographer.java:532)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
10-22 16:01:50.156      476-487/system_process W/ActivityManager﹕ Force finishing activity com.example.kinofood/.MenuActivity
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-22 16:09:00

setAdapter(products);应该从UI Thread中调用,而不是在doInBackground()中调用,因为您在ListView上设置Adapter,这应该在UI Thread上完成。把电话转到onPostExecute()

这意味着您希望将products传递给onPostExecute(),或者更好的做法是将其作为任务类的成员变量,然后可以将结果传递给onPostExecute(),以确保在尝试设置Adapter而不是返回null之前收到了数据。

代码语言:javascript
复制
class RequestTask extends AsyncTask<String, String, String> {
    //declare it here
    ArrayList<String> products = new ArrayList<String>();

    @Override
    protected void onPostExecute(String result) {
        // it's a good idea to check if your dialog isn't null and showing
        if (dialog != null && dialog.isShowing() 
            dialog.dismiss();

        // call the method here
        setAdapter(products);
        super.onPostExecute(result);
    }

而且,正如我所说的,您可能需要检查doInBackground()中的响应,或者productsreturn的大小--响应或大小--以确定您是否得到了任何信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26511820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档