今天调试iWatch程序的时候,开始无论如何都没有iWatch模拟器。
后来发现,在IOS模拟器的菜单中,进行如下操作即可:
Hardware->External Displays->Apple Watch-38mm
或
Hardware->External Displays->Apple Watch-42mm
再次调试程序,目标选择WatchKit App就可以正常运行啦。
Learn and share.
今天调试iWatch程序的时候,开始无论如何都没有iWatch模拟器。
后来发现,在IOS模拟器的菜单中,进行如下操作即可:
Hardware->External Displays->Apple Watch-38mm
或
Hardware->External Displays->Apple Watch-42mm
再次调试程序,目标选择WatchKit App就可以正常运行啦。
- (void)fetchOneHtmlwithUrl:(NSURL *)url withCode:(NSString *)code withValueIn:(double)valueIn withMoneyIn:(double)moneyIn
{
NSError *error;
NSData *dataGB2312 = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error];
NSStringEncoding gb2312Encoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *htmlGB2312 = [[NSString alloc] initWithData:dataGB2312 encoding:gb2312Encoding];
NSString *utf8HtmlStr = [htmlGB2312 stringByReplacingOccurrencesOfString:@"charset=gb2312"
withString:@"charset=utf-8"];
NSData *dataUTF8 = [utf8HtmlStr dataUsingEncoding:NSUTF8StringEncoding];
ParseResultBean *bean = [ParseResultBean alloc];
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:dataUTF8];
NSArray *eArrayCode = [xpathParser searchWithXPathQuery:@"/html/body/div[1]/div[7]/div[2]/div[1]/div[1]/div[1]/span[2]"];
TFHppleElement *eCode = [eArrayCode objectAtIndex:0];
bean->code = [[eCode attributes] objectForKey:@"title"];
[allRows addObject:bean];
}
NSError *parseError;
NSData *jsonData = [sJsonText dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&parseError];
if (json == nil)
{
NSLog(@"json parse failed. \r\n");
//NSLog([[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
NSLog(@"%@",[parseError localizedDescription]);
return;
}
NSArray *jijinArray = [json objectForKey:@"jijinlist"];
for(NSDictionary *jijin in jijinArray)
{
NSString *sCode = [jijin objectForKey:@"code"];
NSString *sValuein = [jijin objectForKey:@"valuein"];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
CGFloat f = 30.0;
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:f];
[statusItem setHighlightMode:YES];
[statusItem setTitle:[NSString stringWithFormat:@"%@",@"Hi"]];
[statusItem setMenu:statusMenu];
[statusItem setEnabled:YES];
}
using System;
using System.Text;
using Microsoft.Win32;
namespace GPJJ
{
class XWin32Utils
{
private const String KEY_PATH = "SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN";
private const String VALUE_NAME = "GPJJEXE";
public static bool isAutoRun()
{
RegistryKey key = Registry.LocalMachine;
RegistryKey autorun = key.OpenSubKey(KEY_PATH, true);
Object o = autorun.GetValue(VALUE_NAME);
autorun.Close();
if(o==null)
{
return false;
}
else
{
return true;
}
}
public static void SetAutoRun(String exePath)
{
RegistryKey key = Registry.LocalMachine;
RegistryKey autorun = key.OpenSubKey(KEY_PATH, true);
autorun.SetValue(VALUE_NAME, exePath, RegistryValueKind.String);
}
public static void RemoveAutoRun()
{
if(isAutoRun())
{
RegistryKey key = Registry.LocalMachine;
RegistryKey autorun = key.OpenSubKey(KEY_PATH, true);
autorun.DeleteValue(VALUE_NAME);
}
}
}
}
最近写了一个自动启动的QT程序,将程序及DLL都放到了同一个目录下。
双击启动,当然没有问题。
但设置为自动启动的时候,就提示找不到需要的DLL了。
最简单的方法,当然就是将DLL放到System32下面或者将DLL放到其他PATH的路径下面。
但我自己的环境已经够复杂了,实在是不想有其他冲突了。
于是,用VS写了一个启动用的Loader。
这个Loader啥都不干,就是先设置PATH,然后将参数传递给QT的EXE,启动之。
1、不可以在UI线程直接读取网络数据,所以另起线程处理这件事情
public class MainActivity extends ActionBarActivity implements IParseJsonCallback,IParseHtmlCallback{
public void ParseJsonPage(List<PhaseResultBean> resultList) {
new ParseJson(this).execute(resultList);
}
@Override
public void ParseJsonDone(List<PhaseResultBean> resultList) {
//回调函数
}
}
2、回调接口
package com.neohope.android.gpjj;
import java.util.List;
public interface IParseJsonCallback {
void ParseJsonDone(List<PhaseResultBean> resultList);
}
3、解析Json类
package com.neohope.android.gpjj;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class ParseJson extends AsyncTask<String,Void,List<PhaseResultBean>>{
private IParseJsonCallback jsonCallback;
public ParseJson(IParseJsonCallback jsonCallback)
{
this.jsonCallback = jsonCallback;
}
@Override
protected List<PhaseResultBean> doInBackground(String... params) {
if(params==null)return null;
List<PhaseResultBean> resultList= new ArrayList<PhaseResultBean>();
String jsonString = params[0];
try {
JSONObject json= new JSONObject(jsonString);
JSONArray jijinlist = json.getJSONArray("jijinlist");
for(int i=0;i<jijinlist.length();i++)
{
JSONObject JJ= jijinlist.getJSONObject(i);
PhaseResultBean result = new PhaseResultBean();
result.code = JJ.getString("code");
resultList.add(result);
}
} catch (JSONException e) {
e.printStackTrace();
}
return resultList;
}
@Override
protected void onPostExecute(List<PhaseResultBean> resultList) {
super.onPostExecute(resultList);
jsonCallback.ParseJsonDone(resultList);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
1、不可以在UI线程直接读取网络数据,所以另起线程处理这件事情
public class MainActivity extends ActionBarActivity implements IParseJsonCallback,IParseHtmlCallback{
public void ParseHtmlPage(List<PhaseResultBean> resultList) {
new ParseHtml(this).execute(resultList);
}
@Override
public void ParseHtmlDone(List<PhaseResultBean> resultList) {
//回调函数
}
}
2、回调接口
package com.neohope.android.gpjj;
import java.util.List;
public interface IParseHtmlCallback {
void ParseHtmlDone(List<PhaseResultBean> resultList);
}
3、解析HTML类
package com.neohope.android.gpjj;
import android.os.AsyncTask;
import android.util.Log;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.List;
public class ParseHtml extends AsyncTask<List<PhaseResultBean>,Void,List<PhaseResultBean>>{
private IParseHtmlCallback htmlCallback;
public ParseHtml(IParseHtmlCallback htmlCallback)
{
this.htmlCallback = htmlCallback;
}
@Override
protected List<PhaseResultBean> doInBackground(List<PhaseResultBean>... paramList) {
if(paramList==null)return null;
List<PhaseResultBean> params = paramList[0];
for(PhaseResultBean bean : params) {
Document doc = null;
String url = bean.httpUrl;
try {
doc = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6").timeout(5000).followRedirects(true).get();
} catch (IOException ex) {
Log.w("", ex.getMessage());
return null;
}
Document content = Jsoup.parse(doc.toString());
Element dodydiv = content.getElementById("bodydiv");
Element div = dodydiv.child(6).child(1).child(0).child(0);
Element code = div.child(0).child(2);
String szCode = code.text();
Element title = div.child(0).child(1);
String szTitle = title.text();
bean.code = szCode;
bean.name = szTitle;
}
return params;
}
@Override
protected void onPostExecute(List<PhaseResultBean> listResult) {
super.onPostExecute(listResult);
htmlCallback.ParseHtmlDone(listResult);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
void MainWindow::initTimer()
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerRecalc()));
timer->start(1000*6);
}
void MainWindow::timerRecalc()
{
for(int i=0;i<eventArray->size();i++)
{
NMyEvent myEvent = eventArray->at(i);
ui->tableMain->setItem(i, 0, new QTableWidgetItem(myEvent.EventName));
ui->tableMain->setItem(i, 1, new QTableWidgetItem(NMyUtils::formatDate(myEvent.TimeBegin)));
ui->tableMain->setItem(i, 2, new QTableWidgetItem(NMyUtils::formatDate(myEvent.TimeDue)));
myEvent.reCalcDaysLeft();
ui->tableMain->setItem(i, 3, new QTableWidgetItem(myEvent.DaysLeft));
ui->tableMain->setItem(i, 4, new QTableWidgetItem(myEvent.Comments));
}
}
void MainWindow::readJson(QString fileName)
{
QString szContent = NMyUtils::readFile(NMyUtils::getFileFullPath(fileName));
QJsonDocument jDoc = QJsonDocument::fromJson(szContent.toUtf8());
QJsonObject jObj = jDoc.object();
QJsonArray jReminderItems = jObj.value(QString("Reminder")).toArray();
foreach (const QJsonValue & item, jReminderItems)
{
QJsonValue eName = (item.toObject())["EventName"];
QJsonValue tBegin = (item.toObject())["TimeBegin"];
QJsonValue tDue = (item.toObject())["TimeDue"];
QJsonValue comments = (item.toObject())["Comments"];
const NMyEvent *myevent = NMyEvent::newEvent(eName.toString(),tBegin.toString(),tDue.toString(),comments.toString());
eventArray->append(*myevent);
}
}