关于ui线程与子线程通信的问题

youdiving 2013-05-10 10:44:15
我自定义了一个MyView类,在主界面用到了myview控件,此程序是一个关于手写输入方面的,在myView的OnTouch事件的Action_up事件里,有两个费时操作,导致程序反应非常慢,想让ljbhibie()和tjshibie()两个方法添加到子线程里处理,但根据两个方法的返回结果又涉及到主界面的更新和访问数据库的操作,在网上看了好多handler等处理线程通信的问题,但还是毫无头绪,求大神指点
public class MainActivity extends Activity
{
public static Point store=new Point();
//public static ArrayList<Point> loc=new ArrayList<Point>() ;//记录笔画坐标
private MyOpenHelper myopenhelper;
private MyView myview1;
public static TextView txtview;
public static ListView listv;
LinearLayout in;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button)findViewById(R.id.testsqlite);
txtview=(TextView)findViewById(R.id.text1);
listv=(ListView)findViewById(R.id.listview1);
in=(LinearLayout)findViewById(R.id.input);
myopenhelper = new MyOpenHelper(this);
button1.setOnClickListener(new ClickEvent());
Log.i("Oncreate","can excute!");
myview1 = (MyView) findViewById(R.id.drawview1);
Button btnmeaning=(Button)findViewById(R.id.btnmean);
if(btnmeaning==null)
{
System.out.println("btnmeaning is null");
}
btnmeaning.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0)
{
Intent intent=new Intent();
float pixels[];
int count=0;
ArrayList<Float> picf=new ArrayList<Float>();
if( MyView.allpoints!=null && MyView.allpoints.length>0)
{Log.i("onclick","newloc is not null");
for(int i=0;i<MyView.allpoints.length;i++)
{
for(int j=0;j<MyView.allpoints[i].length;j++)
{
if(MyView.allpoints[i][j]==1)
{
float x=i;
float y=j;
picf.add(y);
picf.add(x);
count+=2;
}

}
}
Object obj[]=picf.toArray();
pixels=new float[obj.length];
for(int i=0;i<obj.length;i++)
{
pixels[i]=Float.parseFloat(obj[i].toString());
}

System.out.println(pixels.toString());
intent.putExtra("picaxis",pixels);
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
}

}

});

}
public void setTextView(String text)
{
txtview.setText(text);
}
public void setAdapter(ArrayAdapter<String> adapter)
{
listv.setAdapter(adapter);
}
@SuppressLint("NewApi")
public void setbackgroundpicture(String imagename)
{
int resid=getResources().getIdentifier(imagename,"drawable","com.example.ybhy");
System.out.println(imagename);
myview1.setBackgroundResource(resid);

}
Bihua bihua;
Word word;
Zib zib;
ZiYinYi ziyinyi;

public class ClickEvent implements OnClickListener
{

@Override
public void onClick(View v)
{

if(MyView.ccs!=null)
{
MyView.ccs.clear();
}
MyView.bh="";
if(MyView.loc!=null)
{
MyView.loc.clear();
}
if(MyView.cacheCanvas !=null)
{
MyView.cacheBitmap=Bitmap.createBitmap(MyView.view_width, MyView.view_height, Config.ARGB_8888);
MyView.cacheCanvas=new Canvas();
MyView.cacheCanvas.drawColor(0x00FFFFFF);
MyView.path=new Path();
MyView.cacheCanvas.setBitmap(MyView.cacheBitmap);
//myview1.clear();
myview1.setBackgroundDrawable(null);
myview1.invalidate(); }
listv.setAdapter(null);
txtview.setText("");
MyView.bhnum=0;
MyView.newpoints=new int [myview1.getHeight()][myview1.getWidth()];
MyView.allpoints=new int[myview1.getHeight()][myview1.getWidth()];

}


}

public class MyView extends View {
public static ArrayList<Point> loc=new ArrayList<Point>();//记录笔画坐标
public static ArrayList<Point> newloc=new ArrayList<Point>();//处理后的坐标
public static int newpoints[][];//处理后鼠标轨迹
public static int allpoints [][];//整个字的鼠标轨迹
......
public static ArrayList ccs=new ArrayList();
public static DataBaseHelper dbhelp;
public static SQLiteDatabase db;
MainActivity ay;
public MyView(Context context, AttributeSet attrs)
{
super(context, attrs);
ay=(MainActivity)context;
dbhelp=new DataBaseHelper(context);
view_width=context.getResources().getDisplayMetrics().widthPixels;
view_height=context.getResources().getDisplayMetrics().heightPixels;

......

}


......
@Override
public boolean onTouchEvent(MotionEvent event) {
int x=(int)event.getX();
int y=(int)event.getY();
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
......
break;
case MotionEvent.ACTION_MOVE:
if(flag)
{ int history=event.getHistorySize();
for(int i=0;i<history;i++)
{
x=(int)event.getHistoricalX(i);
y=(int)event.getHistoricalY(i);
loc.add(new Point(x,y));
}
path.moveTo(x,y);
path.lineTo(x,y);
cacheCanvas.drawLine(startX,startY,x,y,paint);
startX=x;
startY=y;
loc.add(new Point(startX,startY));

}

break;
case MotionEvent.ACTION_UP:
path.reset();
System.out.println("loc"+loc.toString());
bhnum++;
pic=new int[this.view_height][this.view_width];
for(int i=0;i<pic.length;i++)
for(int j=0;j<pic[i].length;j++)
pic[i][j]=0;
flag=false;
for(int i=0;i<loc.size();i++)
{

Point st=(Point)loc.get(i);
if(st.x>=this.view_width|| st.x<0|| st.y>=this.view_height||st.y<0)
{
continue;
}
int sty=st.y;
int stx=st.x;
pic[sty][stx]=1;
}

ArrayList aa=new ArrayList();
aa=ljshibie();费时操作
ArrayList bb=new ArrayList();
bb=tjshibie();费时操作

ccs=PutResult(aa,bb);
if( ccs !=null &&ccs.size()>0)
{
CharSequence cs=(String)ccs.get(0);
ay.setTextView((String)ccs.get(0));给MainActivity的textview赋值
db=dbhelp.getReadableDatabase();
Cursor cur=db.rawQuery("select imgname from zipic where zi=?",new String[]{cs.toString()});
while(cur.moveToNext())
{
String picname=cur.getString(cur.getColumnIndex("imgname"));
System.out.println(picname);
ay.setbackgroundpicture(picname);
}

String [] strr=new String [ccs.size()];
for(int i=0;i<ccs.size();i++)
{
strr[i]=(String)ccs.get(i);
}
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this.getContext(),android.R.layout.simple_list_item_single_choice,strr);
ay.setAdapter(adapter);
loc.clear();
newloc.clear();
newpoints=new int[this.view_height][this.view_width];

}
break;
}
invalidate();
return true;
}
...全文
251 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
youdiving 2013-05-13
  • 打赏
  • 举报
回复
好吧,刚学android 的菜鸟郁闷一下
haoyizsw 2013-05-12
  • 打赏
  • 举报
回复
引用 7 楼 youdiving 的回复:
[quote=引用 6 楼 haoyizsw 的回复:] onclick(){ do somthing() startThread(); } startThread(){ new thread(){ public void run(){ do your long-time consuming operation; handler(msg);//将你的结果通知到主线程(UI线程),所以这个handler必须是主线程中定义 } } Handler handler = new Handler(){ ...实现handlemessage方法,根据返回的消息实现你界面的变更或者其他逻辑 } }
我费时的操作是在自定义控件的OnTouch事件(触摸事件)的Action_up事件里执行的啊[/quote] 蛋疼!我写的onclick 你就不会自己替换一下啊
haoyizsw 2013-05-11
  • 打赏
  • 举报
回复
onclick(){ do somthing() startThread(); } startThread(){ new thread(){ public void run(){ do your long-time consuming operation; handler(msg);//将你的结果通知到主线程(UI线程),所以这个handler必须是主线程中定义 } } Handler handler = new Handler(){ ...实现handlemessage方法,根据返回的消息实现你界面的变更或者其他逻辑 } }
youdiving 2013-05-11
  • 打赏
  • 举报
回复
引用 3 楼 shen332401890 的回复:
[quote=引用 2 楼 youdiving 的回复:] 可是我费时的操作在控件的up事件里,我不知道怎样用了,看了好多例子都是在Activity的OnCreate事件里写的
费时的操作 尽量用线程处理 然后通过handle 给主线程 也就是 UI线程处理结果[/quote] 我总不能在up事件里每次执行都开启一个线程吧,要是在MainActivity里面开子线程,怎么处理自定义控件up事件里的费时操作呢
youdiving 2013-05-11
  • 打赏
  • 举报
回复
引用 6 楼 haoyizsw 的回复:
onclick(){ do somthing() startThread(); } startThread(){ new thread(){ public void run(){ do your long-time consuming operation; handler(msg);//将你的结果通知到主线程(UI线程),所以这个handler必须是主线程中定义 } } Handler handler = new Handler(){ ...实现handlemessage方法,根据返回的消息实现你界面的变更或者其他逻辑 } }
我费时的操作是在自定义控件的OnTouch事件(触摸事件)的Action_up事件里执行的啊
  • 打赏
  • 举报
回复
还是要去好好看看handler,在android中,线程里是不能直接更新UI的,所以要让handler发送消息给UI线程,需要更新哪些UI,UI线程中,会有队列排好,依次执行在队列里的更新任务
顾小林 2013-05-10
  • 打赏
  • 举报
回复
引用 2 楼 youdiving 的回复:
可是我费时的操作在控件的up事件里,我不知道怎样用了,看了好多例子都是在Activity的OnCreate事件里写的
费时的操作 尽量用线程处理 然后通过handle 给主线程 也就是 UI线程处理结果
youdiving 2013-05-10
  • 打赏
  • 举报
回复
可是我费时的操作在控件的up事件里,我不知道怎样用了,看了好多例子都是在Activity的OnCreate事件里写的

80,349

社区成员

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

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