Android 单独开启线程处理服务器数据提交和访问

问题描述:在模拟器上Android应用成功访问本地局域网网络,所有功能正常,于是换到真机上测试结果只能登录成功,后续的操作都是失败的。起初怀疑是否是登录cookie的问题,但是在模拟机上都可以说明不是cookie的问题,真机浏览器可以访问局域网应用。最后想到登录是new了线程的,登录没有问题,但是后面执行网络访问无论如何都访问不到数据,就是因为没有开启新的线程。

问题原因:Android在与服务器实现数据访问和处理的时候,直接在UI线程内部处理是不允许的,这样会导致请求失败,推测这与Android的网络访问机制有关。

处理方法:开启一个新线程(Thread)来处理UI主线程需要访问和处理的服务器数据。

package com.boonya.wtms.activities;

import java.io.Serializable;
import java.util.List;
import com.boonya.baidumap.R;
import com.boonya.wtms.pojo.DrillingTaskPojo;
import com.boonya.wtms.service.DrillingTaskService;
import com.boonya.wtms.utils.Constant;
import com.boonya.wtms.utils.ShowToast;
import com.boonya.wtms.utils.SpinnerSelectedListener;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class DrillingSearchingActivity extends Activity
{

    private TextView taskProcessStatusV;

    private Button searchButton;

    private Spinner processSpinner;

    private ArrayAdapter<String> processAdapter;

    private EditText measureLineNo;

    private EditText wellsNo;

    private DrillingTaskService drillingTaskService;

    Context tag = DrillingSearchingActivity.this;

    private ShowToast showToast;

    private List<DrillingTaskPojo> taskPojos;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_drilling_searching);

        drillingTaskService = new DrillingTaskService(tag);

        searchButton = (Button) findViewById(R.id.searchingBtn);

        showToast = new ShowToast(tag);

        taskProcessStatusV = (TextView) findViewById(R.id.taskProcessStatusV);

        measureLineNo = (EditText) findViewById(R.id.field_measureline_no);
        wellsNo = (EditText) findViewById(R.id.field_wells_no);

        // 下拉框数据填充
        processSpinner = (Spinner) findViewById(R.id.taskProcessStatus);
        // 将可选内容与ArrayAdapter连接起来
        processAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, Constant.spinnerProcessV);
        // 设置下拉列表的风格
        processAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // 将adapter 添加到spinner中
        processSpinner.setAdapter(processAdapter);
        // 添加事件Spinner事件监听
        processSpinner.setOnItemSelectedListener(new SpinnerSelectedListener(taskProcessStatusV, Constant.spinnerProcessV));
        // 设置默认值
        processSpinner.setVisibility(View.VISIBLE);

        searchButton.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0)
            {
                Thread serviceThread = new Thread(new ServiceThread());
                serviceThread.start();
                try
                {
                    // 等待线程将数据查询完成
                    Thread.sleep(2000);
                    // 查询到数据做相应处理
                    if (taskPojos != null && taskPojos.size() > 0)
                    {
                        Intent intent = new Intent();
                        intent.putExtra("tasks", (Serializable) taskPojos);
                        intent.setClass(DrillingSearchingActivity.this, DrillingSearchingListActivity.class);
                        startActivity(intent);
                    } else
                    {
                        showToast.showToast("未查询到任何钻井任务记录");
                    }
                } catch (InterruptedException e)
                {
                    Log.d("log", "ServiceThread task search exception:"+e.getMessage());
                }

            }
        });

    }

    /**
     * 自定义类:ServiceThread线程类(内部类)
     */
    class ServiceThread implements Runnable
    {
        @Override
        public void run()
        {
            int processStatus = -1;
            
            String measureLineNoVal = measureLineNo.getText().toString();
            
            String wellsNoVal = wellsNo.getText().toString();
            
            processStatus = processSpinner.getSelectedItemPosition() - 1;
            
            taskPojos = drillingTaskService.findTasksFromServer(measureLineNoVal, wellsNoVal, processStatus);
            
            Log.d("log", "钻井查询,共查询到记录:" + (taskPojos == null ? 0 : taskPojos.size()) + "条.");

        }
    }
}

注:ServiceThread 中run函数的代码如果直接放在searchButton的OnclickListener的OnClick方法内部执行是不成功的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值