安卓定时任务Timer一直失败

阿凡行舟 2016-04-12 12:08:11
java核心源码:作用:从服务器上获取数据,更新UI

protected void onCreate(Bundle savedInstanceState) {
timer = new Timer();
timer.schedule(task, 2000,2000);
task = new TimerTask() {
@Override
public void run() {
bundle = getJson.GetState(getSave("backId"));
int backid = bundle.getInt("backid");
if (backid != -1) {
Message message = new Message();
message.what = SENDING_MSG;
message.setData(bundle);
mhandler.sendMessage(message);
timer.cancel();
}else{
}
}
};
}

// 线程处理
private Handler mhandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mpDialog.dismiss();
switch (msg.what) {
case SENDING_MSG:
chronometer.stop();
chronometer.setVisibility(View.GONE);
result.setText(String.format(getString(R.string.sijiMsg),
msg.getData().getString("name"),
msg.getData().getString("phone")));
break;
case LOGINSUCCESS_MSG:
ShowToast("取消打车成功!");
startActivity(new Intent(CallSuccess.this, StepOne.class));
break;
case LOGINFAIL_MSG:
ShowToast("取消打车失败!");
break;
}
}
};


每次程序运行到这个这个页面,2秒(定时器开始的时间),apk就强退了。。
在下面打印,run方法没有被执行到,请大神赐教!
一直做php,刚学习android
...全文
446 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿凡行舟 2016-04-14
  • 打赏
  • 举报
回复
在eclipse上就可以获取到json数据了,在android studio里不行。。。定时器的问题最终变成了json数据获取的问题。
阿凡行舟 2016-04-13
  • 打赏
  • 举报
回复

//获取状态
	public static Bundle GetState(String id){
		Bundle bundle = new Bundle();
		try {
			String content = getUrlContent(
					String.format(
							"http://modicall.applinzi.com/Home/Modi/getState.html?getState=11&id=%1$s",
							id), 5000);//设置返回值为id
			Log.d("backid","2到了");
			try {
				JSONObject obj = new JSONObject(content);
				if (obj != null) {
					int backid = Integer.parseInt(obj.getString("backid").toString());
					Log.d("backid", "3到了");
					if (backid != -1) {
						bundle.putInt("backid", backid);//和接收的id一样
						bundle.putString("name", obj.getString("name"));
						bundle.putString("phone", obj.getString("phone"));
						Log.d("backid", "4-1到了");
					} else {
						bundle.putInt("backid", -1);
						Log.d("backid", "4-2到了");
					}
				}else{
					bundle.putInt("backid", -1);
					Log.d("backid", "4-5到了,Json获取失败");
				}

			} catch (JSONException e) {
				e.printStackTrace();
				Log.d("backid","4-3到了+"+e.getMessage());
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.d("backid","4-4到了");
		}
		Log.d("backid","5到了");
		return bundle;
	}
结果是: 04-13 00:19:02.126 21169-21169/? D/backid: 1到了 04-13 00:19:02.133 21169-21169/? D/backid: 2到了 04-13 00:19:02.135 21169-21169/? D/backid: 4-3到了+End of input at character 0 of 04-13 00:19:02.135 21169-21169/? D/backid: 5到了 输入网址直接访问是:{"backid":"1","name":"\u963f\u51e1","phone":"1123456"} Json抛出异常是什么原因?
  • 打赏
  • 举报
回复
你这两句要换一个位置啊!  timer.schedule(task, 2000,2000); task = new TimerTask() { 你task还没赋值就开始timer.schedule(task, 2000,2000);了 run怎么可能会执行
panzhiling 2016-04-13
  • 打赏
  • 举报
回复
看json抛出什么异常,你应该先看看json的解析用法。http://stormzhang.com/android/2014/05/22/android-gson/
AImmorta1 2016-04-13
  • 打赏
  • 举报
回复
public class HelpService extends Service{

    private Context context;
    private long n;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        context = this;
        n = 0 ;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(){
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(100);
                        if (!isWorked("com.ql.activity.service.LongevityService")) {
                            Intent i = new Intent(context, LongevityService.class);
                            context.startService(i);
                        }
                        if (n++%100 == 0) {
                            Log.v("dddd", "HelpService");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();


        return START_STICKY;
    }
阿凡行舟 2016-04-13
  • 打赏
  • 举报
回复

private static String getUrlContent(String url, int timeOut) {
		String str = "";
		try {

			URL aURL = null;
			try {
				aURL = new URL(url);
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}

			URLConnection conn = aURL.openConnection();
			conn.connect();
			StringBuilder b = new StringBuilder();
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					conn.getInputStream(), "UTF-8"));

			String line;
			while ((line = reader.readLine()) != null) {
				b.append(line);
			}
			reader.close();
			str = b.toString();
			Log.d("strfanhui",str);
		} catch (IOException e) {
		} catch (Exception e) {
		}
		return str;
	}
这是getUrlContent的安卓部分代码,其它取消都是通过它,可以使用
阿凡行舟 2016-04-13
  • 打赏
  • 举报
回复
找到了问题所在:从服务器上返回的json是空的。

大神帮忙看下服务器代码吧,刚接触安卓的php程序员,写的比较简单,勿怪啊

/**
* 获取状态
*/
public function getState(){
$sta = I('get.getState','');
$fdata = array();//返回Data
if($sta == '11'){
$id = I('get.id','');
$sData = M('sendinfo')->where(array('id'=>$id))->field('siji,status')->find();
if($sData['status'] == 1){
$sijiData = M('ucenter_member')->where(array('id'=>$sData['siji']))->field('username,mobile')->find();
$fdata['backid'] = (int)$id;
$fdata['name'] = urldecode($sijiData['username']);
$fdata['phone'] = $sijiData['mobile'];
$backStr = json_encode($fdata);
}else {
$fdata['backid'] = -1;
$backStr = json_encode($fdata);
}
echo $backStr;
}
}

我用echo直接输出了json
阿凡行舟 2016-04-12
  • 打赏
  • 举报
回复
引用 2 楼 节操在此的回复:
task实例化在timer.schedule(task, 2000,2000)后你觉得不会报空指针么
这些变量都已经初始化了,没写出来。我试过HandpostDelay那个方法,也是会强退。
节操在此 2016-04-12
  • 打赏
  • 举报
回复
task实例化在timer.schedule(task, 2000,2000)后你觉得不会报空指针么
Birds2018 2016-04-12
  • 打赏
  • 举报
回复
getJson 这个对象可能为空。mpDialog 这个对象也可能为空。 只能看控制台异常了。
阿凡行舟 2016-04-12
  • 打赏
  • 举报
回复
谁可以提供一个定时刷新的源码参考下,大神们

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧